CUDA:错误C2491:'log1p':不允许定义dllimport函数

时间:2009-12-10 23:51:45

标签: c visual-studio-2008 dll cmake cuda

我尝试将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。这是问题吗?

3 个答案:

答案 0 :(得分:1)

我甚至不知道CUDA是什么,但我会查看编译器错误的代码(math_functions.h)并查看第3459行,看看它正在尝试做什么并从那里开始。这似乎与您在发布的代码中尝试的内容无关。

答案 1 :(得分:1)

顺便提一下,如果您使用CUDA 2.3(或者,最好是3.0),那么您应该能够摆脱外部的“C”。

答案 2 :(得分:0)

实际上,CUDA库定义了log1p函数,因此我试图将CUDA添加到代码中的代码模糊不清。因此,两者之间存在某种冲突。我只是在我的代码中重命名了该函数,并且它有效!