私はCUDAが初めてで、基本的なカーネルをデバイスで実行しようとしています。サンプルをコンパイルして実行したので、デバイス ドライバーが動作するか、CUDA が正常に動作するかがわかります。私の目標は、C++ コードで CADU を呼び出してタスクを大幅に高速化することです。これを行う方法について、オンラインでさまざまな投稿を読んでいます。具体的には、[こちら]: nvcc でコンパイルされていない C++ コードから CUDA ランタイム関数を呼び出すことはできますか? .
私の質問は非常に単純です (受け入れて) コードをコンパイルして実行すると (以下に投稿)、エラーは発生しませんが、カーネルは実行されていないようです。これは簡単に修正できるはずですが、6時間後には途方に暮れています。これを NVIDIA フォーラムに投稿したいのですが、まだダウンしています :/. 答えは非常に基本的なものだと確信しています-何か助けはありますか? 以下は、私のコード、それをコンパイルする方法、および表示される端末出力です。
main.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern void kernel_wrapper(int *a, int *b);
int main(int argc, char *argv[]){
int a = 2;
int b = 3;
printf("Input: a = %d, b = %d\n",a,b);
kernel_wrapper(&a, &b);
printf("Ran: a = %d, b = %d\n",a,b);
return 0;
}
kernel.cu
#include "cuPrintf.cu"
#include <stdio.h>
__global__ void kernel(int *a, int *b){
int tx = threadIdx.x;
cuPrintf("tx = %d\n", tx);
switch( tx ){
case 0:
*a = *a + 10;
break;
case 1:
*b = *b + 3;
break;
default:
break;
}
}
void kernel_wrapper(int *a, int *b){
cudaPrintfInit();
//cuPrintf("Anything...?");
printf("Anything...?\n");
int *d_1, *d_2;
dim3 threads( 2, 1 );
dim3 blocks( 1, 1 );
cudaMalloc( (void **)&d_1, sizeof(int) );
cudaMalloc( (void **)&d_2, sizeof(int) );
cudaMemcpy( d_1, a, sizeof(int), cudaMemcpyHostToDevice );
cudaMemcpy( d_2, b, sizeof(int), cudaMemcpyHostToDevice );
kernel<<< blocks, threads >>>( a, b );
cudaMemcpy( a, d_1, sizeof(int), cudaMemcpyDeviceToHost );
cudaMemcpy( b, d_2, sizeof(int), cudaMemcpyDeviceToHost );
printf("Output: a = %d\n", a[0]);
cudaFree(d_1);
cudaFree(d_2);
cudaPrintfDisplay(stdout, true);
cudaPrintfEnd();
}
次のコマンドを使用して、ターミナルから上記のコードをコンパイルします。
g++ -c main.cpp
nvcc -c kernel.cu -I/home/clj/NVIDIA_GPU_Computing_SDK/C/src/simplePrintf
nvcc -o main main.o kernel.o
コードを実行すると、次の端末出力が得られます。
$./main
Input: a = 2, b = 3
Anything...?
Output: a = 2
Ran: a = 2, b = 3
main.cpp が正しくコンパイルされ、kernel.cu コードが呼び出されていることは明らかです。明らかな問題は、カーネルが実行されていないように見えることです。これに対する答えは基本的なものだと確信しています-非常に基本的です。しかし、何が起こっているのかわかりません - 助けてください?