1. 程式人生 > >CUDA程式設計實戰——並行向量求和

CUDA程式設計實戰——並行向量求和

多個並行執行緒塊完成兩個向量的求和:

程式碼如下(使用了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;
}

執行結果: