0

複数のライブラリ (DLL) が作成されている既存のプロジェクトに CUDA を統合しようとしています。内積を計算する非常に単純なカーネルから始めました。

// 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 としてエクスポートされます。これは問題ですか?

4

3 に答える 3

1

ちなみに、CUDA 2.3(またはできれば3.0)を使用している場合は、外部の「C」を取り除くことができるはずです。

于 2009-12-12T15:10:06.443 に答える
1

CUDA が何かもわかりませんが、コンパイラ エラー (math_functions.h) が発生したコードを見て、3459 行目を見て、何をしようとしているのかを確認し、そこから始めます。投稿したコードでやろうとしていることとは無関係のようです。

于 2009-12-11T03:55:32.380 に答える
0

実際、CUDA ライブラリは log1p 関数を定義しているため、CUDA を追加しようとしているコードのあいまいな部分がありました。したがって、両者の間にはある種の対立がありました。コード内の関数の名前を変更しただけで、うまくいきました!

于 2009-12-11T22:25:20.317 に答える