CUDA程式設計實戰——並行向量求和
阿新 • • 發佈:2018-12-31
多個並行執行緒塊完成兩個向量的求和:
程式碼如下(使用了10個並行執行緒塊):
#include <iostream> #include "book.h" using namespace std; #define N 10 __global__ void add(int *a, int *b, int *c) { //blockIdx表示並行執行緒塊的索引 int tid = blockIdx.x; //計算該索引處的資料 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; //在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))); //在CPU上為a和b賦值 for (int i = 0; i<N; i++) { a[i] = -i; b[i] = i * i; } //將陣列a和b複製到GPU HANDLE_ERROR(cudaMemcpy(dev_a, a, N * sizeof(int), cudaMemcpyHostToDevice)); HANDLE_ERROR(cudaMemcpy(dev_b, b, N * sizeof(int), cudaMemcpyHostToDevice)); //N表示在執行核函式時使用的並行執行緒塊的數量 add << <N, 1 >> >(dev_a, dev_b, dev_c); //將陣列c從GPU複製到CPU HANDLE_ERROR(cudaMemcpy(c, dev_c, N * sizeof(int), cudaMemcpyDeviceToHost)); for (int i = 0; i<N; i++) { printf("%d + %d = %d\n", a[i], b[i], c[i]); } //釋放在GPU上釋放的記憶體 HANDLE_ERROR(cudaFree(dev_a)); HANDLE_ERROR(cudaFree(dev_b)); HANDLE_ERROR(cudaFree(dev_c)); system("pause"); return 0; }
執行結果: