上週我開始CUDA,因爲我必須將現有的C++程序轉換爲cuda以供我的研究。基本CUDA指針/數組內存分配和使用
這是CUDA by Example書中的一個基本示例,我向任何想學習CUDA的人推薦!
有人可以解釋如何用'dev_c'這是一個空指針分配GPU內存?
HANDLE_ERROR(cudaMalloc((void**)&dev_c, N * sizeof(int)));
然後,調用函數「添加」,但對待*時不傳遞任何「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;
}
謝謝!
謝謝你,現在更有意義了!那麼這是否意味着(數組)c中的值被保存在之前在cudaMalloc((void **)&dev_c,N * sizeof(int))中分配的GPU全局內存中? – user2550888
是的。 'c'的內核用法存儲在爲參數'c'傳遞的參數*中,在這種情況下''dev_c'。而'dev_c'已經預先在設備全局內存中設置了分配的大小。這基本上是C行爲,幾乎與CUDA無關。 –
明白了!再次感謝您的詳細回覆,非常感謝! – user2550888