【发布时间】:2013-07-02 15:29:07
【问题描述】:
我上周开始使用 CUDA,因为我必须将现有的 c++ 程序转换为 cuda 以进行研究。
这是 CUDA by Example 一书中的一个基本示例,我推荐给任何想学习 CUDA 的人!
有人能解释一下如何使用空指针“dev_c”分配 GPU 内存吗?
HANDLE_ERROR( cudaMalloc( (void**)&dev_c, N * sizeof(int) ) );
那么,在调用函数'add'时不传递任何'dev_c'值,而是将*c视为全局函数中的一个数组并从函数内部写入?为什么在任何地方都没有将其定义为数组时这可能?
add<<<N,1>>>( dev_a, dev_b, dev_c );
最后,在执行以下加法时,术语 c[0]、c[1] 等到底保存在哪里?
c[tid] = a[tid] + b[tid];
我希望我能很好地解释自己,但请随时提出任何后续问题。对 C 和 CUDA 都是新手,所以要友好:D
完整代码如下:
#include "book.h"
#define N 1000
__global__ void add( int *a, int *b, int *c ) {
int tid = blockIdx.x; // this thread handles the data at its thread id
if (tid < N)
c[tid] = a[tid] + b[tid];
}
int main( void ) {
int a[N], b[N], c[N];
int *dev_a, *dev_b, *dev_c;
// allocate the memory on the GPU
HANDLE_ERROR( cudaMalloc( (void**)&dev_a, N * sizeof(int) ) );
HANDLE_ERROR( cudaMalloc( (void**)&dev_b, N * sizeof(int) ) );
HANDLE_ERROR( cudaMalloc( (void**)&dev_c, N * sizeof(int) ) );
// fill the arrays 'a' and 'b' on the CPU
for (int i=0; i<N; i++) {
a[i] = -i;
b[i] = i * i;
}
// copy the arrays 'a' and 'b' to the GPU
HANDLE_ERROR( cudaMemcpy( dev_a, a, N * sizeof(int),
cudaMemcpyHostToDevice ) );
HANDLE_ERROR( cudaMemcpy( dev_b, b, N * sizeof(int),
cudaMemcpyHostToDevice ) );
add<<<N,1>>>( dev_a, dev_b, dev_c );
// copy the array 'c' back from the GPU to the CPU
HANDLE_ERROR( cudaMemcpy( c, dev_c, N * sizeof(int),
cudaMemcpyDeviceToHost ) );
// display the results
for (int i=0; i<N; i++) {
printf( "%d + %d = %d\n", a[i], b[i], c[i] );
}
// free the memory allocated on the GPU
HANDLE_ERROR( cudaFree( dev_a ) );
HANDLE_ERROR( cudaFree( dev_b ) );
HANDLE_ERROR( cudaFree( dev_c ) );
return 0;
}
谢谢!
【问题讨论】: