我尝试将CUDA集成到现有项目中,其中创建了几个库(DLL)。我从一个非常简单的内核开始计算点积:
// 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进行编译。如果我只使用一个带有foobar函数的.cu文件,该函数不调用内核,那么它执行正常。但是使用上面的代码,我得到以下错误:
c:\cuda\include\math_functions.h(3459) : error C2491: 'log1p' : definition of dllimport function not allowed
调用CUDA代码的结果代码将导出为DLL。这是问题吗?
答案 0 :(得分:1)
我甚至不知道CUDA是什么,但我会查看编译器错误的代码(math_functions.h)并查看第3459行,看看它正在尝试做什么并从那里开始。这似乎与您在发布的代码中尝试的内容无关。
答案 1 :(得分:1)
顺便提一下,如果您使用CUDA 2.3(或者,最好是3.0),那么您应该能够摆脱外部的“C”。
答案 2 :(得分:0)
实际上,CUDA库定义了log1p函数,因此我试图将CUDA添加到代码中的代码模糊不清。因此,两者之间存在某种冲突。我只是在我的代码中重命名了该函数,并且它有效!