2009-12-10 4 views
0

Я пытаюсь интегрировать CUDA в существующий проект, в котором создаются несколько библиотек (DLL). Я начал с очень простым ядром, который вычисляет скалярное произведение:CUDA: ошибка C2491: 'log1p': определение функции dllimport не разрешено

// dotProd_kernel.cu 

__global__ void dotProd(double* result, double* vec1, double* vec2) 
{ 
    int i = threadIdx.x; 
result[i] = vec1[i] * vec2[i]; 
} 

Это ядро ​​вызывается хост сценария:

// doProd.cu 

#include <cutil_inline.h> 
#include <dotProd_kernel.cu> 

extern "C" double CUDA_dot(THTensor *vec1, THTensor *vec2); 

double CUDA_dot(THTensor *vec1, THTensor *vec2) 
{ 
    // [content skipped]  

    // execute the kernel 
    dotProd<<< 1, nbThreads >>>(device_vec1, device_vec2, device_result_array); 

    // [content skipped] 

    return sum; 
} 

Я генерировать файлы сборки с помощью CMake, и использовать Visual Studio 2008 Pro для скомпилируйте его. Если я просто использую файл .cu с функцией foobar, которая не вызывает ядро, она выполняется отлично. Но приведенный выше код, я получаю следующее сообщение об ошибке:

c:\cuda\include\math_functions.h(3459) : error C2491: 'log1p' : definition of dllimport function not allowed 

Результирующий код, который вызывает код CUDA экспортируется как DLL. Это проблема?

+0

комментируйте вызов ядра и скомпилируйте его. Сохраняется ли проблема? Я не вижу вызов log1p в коде выше ... – fabrizioM

+0

Да, я тоже был в замешательстве;)! Но я, наконец, понял это, посмотрю на мой ответ ... Спасибо за помощь! – Wookai

ответ

0

На самом деле библиотека CUDA определяет функцию log1p, а также является неясной частью кода, к которому я пытаюсь добавить CUDA. Таким образом, между ними был какой-то конфликт. Я просто переименовал функцию в свой код, и это сработало!

1

Я даже не знаю, что такое CUDA, но я бы посмотрел на код с ошибкой компилятора (math_functions.h) и посмотрел на строку 3459 и посмотрел, что он пытается сделать, и начните с нее. Кажется, это не связано с тем, что вы пытаетесь сделать в коде, который вы опубликовали.

+1

CUDA - это расширение NVIDIA C, которое используется для доступа к их аппаратным средствам GPU для параллельной обработки. http://en.wikipedia.org/wiki/CUDA –

+0

Кроме того, всегда смотрите номер ошибки C в справке Visual Studio или онлайн в MSDN. Объяснение C2491 приведено здесь: http://msdn.microsoft.com/en-us/library/62688esh(VS.71).aspx –

+0

Спасибо, ребята! Я, конечно, смотрел на код, но, как и в библиотеке, которую я уже использовал и должен работать, проблема должна быть на моей стороне. Код, который я опубликовал, это то, над чем я работал, когда возникла ошибка. Но я понял это, см. Мой ответ ... Спасибо за помощь! – Wookai

1

Кстати, если вы используете CUDA 2.3 (или, предпочтительно, 3.0), то вы должны быть в состоянии избавиться от экстерна «C».

+0

В настоящее время я использую 2.3. У вас есть ссылка на это? – Wookai