5

同じファイル mainFunc.cu で kernelAdd() 関数と main() 関数を使用してコードをビルドすると、問題ありません。

しかし、kernelAdd.cu ファイルの kernelAdd() 関数と main.cpp ファイルのメイン ファイルを分離すると、次の 2 つのエラーでビルドされます。

「エラー C2065: 'add': 宣言されていない識別子」

および「エラー C2059: 構文エラー: '<'」

Visual Studio 2008 と Cuda v5.0 でビルドしました。

また、そのエラーを修正するにはどうすればよいですか?

ありがとう!

kernelAdd.cu

__global__ void add(int a, int b, int *c) {
*c = a + b;
}

mainFunc.cpp

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <conio.h>

int main(void) {

int c;
int *devC;

cudaMalloc((void**) &devC, sizeof(int));
add<<<1,1>>>(2,7,devC);
cudaMemcpy(&c, devC, sizeof(int), cudaMemcpyDeviceToHost);

printf("2+7=%d\n", c);

cudaFree(devC);

getch();
return 0;
}
4

2 に答える 2

6

エラー C2065: 'add': 宣言されていない識別子

このエラーは CUDA とは関係ありません。add関数は一方のコンパイル単位 ( ) に属していますkernelAdd.cuが、もう一方のコンパイル単位 ( mainFunc.cpp) はそれについて何も知りません。この情報を提供するにはkernelAdd.h、関数宣言を含む追加のヘッダー ファイルを作成する必要があります。

__global__ void add(int a, int b, int *c);

そしてそれをに含めますmainFunc.cpp

#include "kernelAdd.h"

すべてのcuorcppファイルは個別にコンパイルされ、インクルードするヘッダー ファイルにある関数のみを認識します。

エラー C2059: 構文エラー: '<'

今、私はここで推測しています(VSも、チェックするWindowsもありません)が、VSは拡張子に基づいてプロジェクト内の各ファイルのコンパイラを選択しているようです。したがってmainFunc.cpp、一般的な C++ コンパイラでコンパイルされますが<<<>>>、カーネル呼び出しの構文は標準 C++ に属しておらず、CUDA からのものです。すべての CUDA 固有の構文は、 でコンパイルされる予定のファイルでのみ使用する必要がありますnvcc

したがって、問題を解決する 1 つの方法は、名前を に変更するmainFunc.cppことmainFunc.cuです。もちろん、メイン ファイル.cppを保持することもできますが、カーネル呼び出しをファイル内の通常の C++ 関数に移動し、ファイルに含まcuれる標準の C++ ヘッダー ファイルで公開する必要があります.cpp

于 2013-08-13T05:27:34.690 に答える