基本的に、.cu ファイルをコンパイルするコンパイラがあり、それらの .cu ファイル内で完全な操作を行っていると思いますが、それらを呼び出そうとすると ( kernel<<<1,1>>>(void)
)、コンパイラは CUDA 構文による構文エラーを登録します。また、 cudaMalloc などの呼び出しは c ファイル内で失敗します。
ここに 3 つの非常に短いファイルがあるので、どこでエラーが発生しているかがわかります。
//kernel.cu
#include "kernel.h"
#include <cuda.h>
#include <cuda_runtime_api.h>
__global__ int kernel(void){
return 5;
}
と
//kernel.h
#ifndef _KERNEL_h_
#define _KERNEL_h_
extern "C" int kernel(void);
#endif
と
//main.c
#include "kernel.h"
#include <cuda.h>
#include <cuda_runtime_api.h>
int main() {
int* device_a;
cudaMalloc( (void**)&device_a, sizeof(int) );
kernel<<<1,1>>>();
}
SDK の例のいくつかからヘッダー ファイルを取得しました。また、CUDA 4.2 でビルド構成を設定しているため、.cu ファイルがコンパイルされるのはなぜですか。偶発的な構文エラーがあった場合は、投稿のために単純化したためであり、実際にソースに含まれているわけではありませんが、念のため言及してください.
kernel.cu は正常にコンパイルされます。
kernel.h の「extern...」行に「error C2059: syntax error : 'string'」というエラーがあります。(これは、C++ の例から取ったからでしょうか?)
main.c にエラーがあります:「エラー C2065: 'kernel': 宣言されていない識別子」
および:「エラー C2059: 構文エラー: '<'」
しかし、カーネル呼び出しをコメントアウトすると、cudaMalloc だけになるので、「エラー LNK2019: 未解決の外部シンボル _cudaMalloc@8 が関数 _main で参照されています」
および:「致命的なエラー LNK1120: 1 つの未解決の外部」
それは Visual Studio 2010 の何かですか、それとも私が含めていないものですか? SDKの例から、私が間違っていることはわかりませんが、それ以外は、三重括弧を使用しない方法を見つけたと思います(CTRL + Fは何も見つかりません)。どんな助けでも大歓迎です。前もって感謝します!
EDIT:さらにいくつかの例を見た後、彼らはトリプルブラケット構文をうまく使用しています。
編集:これを参照として使用する場合、__global__
関数は void のみを返すことができます。私が行ったように、それ以外のものを返そうとすると、コンパイラ エラーが発生します。