0

わかりましたので、15 ドルで購入した「新しい」FX 570 の CUDA を学習しようとしています。コードにエラーはありません。array1_host はその値で開始されますが、メモリをデバイスからホスト値は同じままです。2 番目のカーネル呼び出しを無効にすると、同じことが起こります (このプロジェクトで複数のカーネルを試します)。かなり混乱しています。

#include <cuda_runtime.h>
#include <iostream>

#pragma comment (lib, "cudart")

#define N 5000

__global__ void addArray(float* a, float* b)
{
   a[threadIdx.x] += b[threadIdx.x];
}
__global__ void timesArray(float* a, float* b)
{
   a[threadIdx.x] *= b[threadIdx.x];
}

int main(){
   float array1_host[N];
   float array2_host[N];

   float *array1_device;
   float *array2_device;

   cudaError_t err;

   for(int x = 0; x < N; x++){
       array1_host[x] = (float) x * 2;
       array2_host[x] = (float) x * 6;
   }

   err = cudaMalloc((void**)&array1_device, N*sizeof(float));
   err = cudaMalloc((void**)&array2_device, N*sizeof(float));

   err = cudaMemcpy(array1_device, array1_host, N*sizeof(float),   cudaMemcpyHostToDevice);
   err = cudaMemcpy(array2_device, array2_host, N*sizeof(float), cudaMemcpyHostToDevice);

   dim3 dimBlock( N );
   dim3 dimGrid ( 1 );

   addArray<<<dimGrid, dimBlock>>>(array1_device, array2_device); 
   timesArray<<<dimGrid, dimBlock>>>(array1_device, array2_device);

   err = cudaMemcpy(array1_host, array1_device, N*sizeof(float), cudaMemcpyDeviceToHost);

   cudaFree(array1_device);
   cudaFree(array2_device);

   std::cout << cudaGetErrorString(err) << "\n\n\n\n\n\n";
   std::cout << array1_host;


   cudaDeviceReset();

   system("pause");
   return 0;
}
4

1 に答える 1

3

Nが5000であるため、エラーが発生しますが、ブロック内のthredには制限があります。これは、wikiの機能へのComputeCapabilityリンクによって異なります。
このコードを試してください:

#define K 200

....

dim3 dimBlock( K );
dim3 dimGrid ( N/K );

コードをデバッグするcudaGetLastError()には、カーネルまたは他の関数を呼び出すたびに、CUDAエラーのバグがどこにあるかを知るために使用できます。

于 2013-03-13T09:08:24.350 に答える