我有一个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
========= 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
猜猜我的设置有问题......关于它可能是什么/如何解决它的任何想法?
我在GTX 260上运行它。通过使用nvcc cuda.cu -arch=sm_11
进行编译解决了我的问题。感谢罗伯特为此。