向阵列添加1.0f的CUDA程序似乎没有这样做

时间:2015-10-06 17:31:52

标签: c cuda gpgpu nvidia

我有一个CUDA计划:

#include <stdio.h>
#include <cuda.h>

__global__ void array_add(float *a, int N)
{
  int idx = blockIdx.x * blockDim.x + threadIdx.x;
  if (idx<N) a[idx] = a[idx] + 1.0f;
}

int main(void)
{
  float *a_h, *a_d;
  const int N = 10;
  size_t size = N * sizeof(float);
  a_h = (float *)malloc(size);
  cudaMalloc((void **) &a_d, size);
  for (int i=0; i<N; i++) a_h[i] = (float)i;
  cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice);
  int block_size = 4;
  int n_blocks = N/block_size + (N%block_size == 0 ? 0:1);
  array_add <<< n_blocks, block_size >>> (a_d, N);
  cudaMemcpy(a_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost);
  for (int i=0; i<N; i++) printf("%d %f\n", i, a_h[i]);
  free(a_h); cudaFree(a_d);
}

其实我没写这个,这是一个测试程序。但我确实理解它应该做什么。

我使用nvcc cuda.cu在我的(Linux Mint - Ubuntu 15.04)系统上编译了此文件 - 此文件保存为cuda.cu

它会运行,但输出如下:

./a.out 
0 0.000000
1 1.000000
2 2.000000
3 3.000000
4 4.000000
5 5.000000
6 6.000000
7 7.000000
8 8.000000
9 9.000000

这不是我期望看到的。我希望将值1.0f添加到所有这些值中 - 但这似乎不会发生。

这里出了什么问题?

CUDA Memcheck结果

以下是CUDA Memcheck的结果......

========= CUDA-MEMCHECK
========= Program hit cudaErrorInvalidDeviceFunction (error 8) due to "invalid device function " on CUDA API call to cudaLaunch. 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x2ef313]
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcudart.so.6.5 (cudaLaunch + 0x17e) [0x3686e]
=========     Host Frame:./a.out [0xe02]
=========     Host Frame:./a.out [0xd01]
=========     Host Frame:./a.out [0xd23]
=========     Host Frame:./a.out [0xbbd]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xf0) [0x20a40]
=========     Host Frame:./a.out [0x999]
=========
0 0.000000
1 1.000000
2 2.000000
3 3.000000
4 4.000000
5 5.000000
6 6.000000
7 7.000000
8 8.000000
9 9.000000
========= ERROR SUMMARY: 1 error

猜猜我的设置有问题......关于它可能是什么/如何解决它的任何想法?

GPU类型

我在GTX 260上运行它。通过使用nvcc cuda.cu -arch=sm_11进行编译解决了我的问题。感谢罗伯特为此。

0 个答案:

没有答案