1

基本的に、.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 のみを返すことができます。私が行ったように、それ以外のものを返そうとすると、コンパイラ エラーが発生します。

4

1 に答える 1

3
  1. CUDA カーネルを呼び出す関数を.cuファイルに入れます。

  2. 組み込みコンパイラではなく、CUDA コンパイラで CU ファイルをコンパイルするように VS2010 をセットアップします (CUDA SDK 内にある CUDA ルール ファイル (Cuda.props、Cuda.xml、Cuda.targets) を使用します)。

  3. カーネルを別の拡張子のファイル ( .curnelファイルなど) に配置して、カーネルが直接コンパイルされないようにすることをお勧めします (呼び出された場合のみ)。

  4. CUDA カーネルを呼び出す関数の宣言を.cuhファイルに入れることをお勧めします。

于 2012-06-04T18:25:50.347 に答える