0

我正在尝试将 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 编译它。如果我只是使用一个 .cu 文件和一个不调用内核的 foobar 函数,它执行得很好。但是使用上面的代码,我得到以下错误:

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

调用 CUDA 代码的结果代码将导出为 DLL。这是问题吗?

4

3 回答 3

1

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

于 2009-12-11T03:55:32.380 回答
1

顺便说一句,如果您使用的是 CUDA 2.3(或者,最好是 3.0),那么您应该能够摆脱 extern "C"。

于 2009-12-12T15:10:06.443 回答
0

实际上,CUDA 库定义了 log1p 函数,因此我试图将 CUDA 添加到的代码中一个晦涩的部分也是如此。于是,两人之间就产生了某种冲突。我只是在我的代码中重命名了该函数,它起作用了!

于 2009-12-11T22:25:20.317 回答