1

私はcudaを学ぼうとしています。簡単なコードを実行しようとしています

#include <stdlib.h>
#include <stdio.h>

__global__ void kernel(int *array)
{
 int index = blockIdx.x * blockDim.x + threadIdx.x;

  array[index] = 7;
}

int main(void)
{
  int num_elements = 256;

  int num_bytes = num_elements * sizeof(int);

  // pointers to host & device arrays
  int *device_array = 0;
  int *host_array = 0;

  // malloc a host array
  host_array = (int*)malloc(num_bytes);

  // cudaMalloc a device array
  cudaMalloc((void**)&device_array, num_bytes);

  int block_size = 128;
  int grid_size = num_elements / block_size;

  kernel<<<grid_size,block_size>>>(device_array);

  // download and inspect the result on the host:
  cudaMemcpy(host_array, device_array, num_bytes, cudaMemcpyDeviceToHost);

  // print out the result element by element
  for(int i=0; i < num_elements; ++i)
  {
    printf("%d ", host_array[i]);
  }

  // deallocate memory
  free(host_array);
  cudaFree(device_array);
}

7 を出力するはずですが、0 を出力します このステートメントは実行されないようです "kernel<<>>(device_array);" コンパイルエラーも発生しません。何か助けて??

4

1 に答える 1

2

コードは私のマシンで問題なく動作しますが、カーネル呼び出しの後に必ずcudaDeviceSynchronizeエラー チェックを追加してください。

次のようにコードを変更して、エラーをチェックします。

kernel<<<grid_size,block_size>>>(device_array);
// wait until tasks are completed
cudaDeviceSynchronize();

// check for errors
cudaError_t error = cudaGetLastError();
if (error != cudaSuccess) {
  fprintf(stderr, "ERROR: %s \n", cudaGetErrorString(error));
}
于 2013-01-19T00:12:49.053 に答える