0

私は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 コードが呼び出されていることは明らかです。明らかな問題は、カーネルが実行されていないように見えることです。これに対する答えは基本的なものだと確信しています-非常に基本的です。しかし、何が起こっているのかわかりません - 助けてください?

4

1 に答える 1

3

kernel_wrapper内には、次の呼び出しがあります。

kernel<<< blocks, threads >>>( a, b );

あなたがしていることは、ホスト上に存在する変数への参照をそれに渡すことです。GPUはそれらを操作できません。渡された値はGPU上に存在する必要があります。基本的にd_1とd_2を渡すと問題が解決し、結果はa=12とb=6になります。

kernel<<< blocks, threads >>>( d_1, d_2 );
于 2012-07-21T19:47:59.340 に答える