1. 程式人生 > 其它 >cuda筆記-第一個cuda程式

cuda筆記-第一個cuda程式

技術標籤:C/C++CUDAc語言c++cuda

這裡先說明下一些基本概念:

釋放GPU中的記憶體cudaFree()

CUDA函式的定義:

__global__:定義在GPU上,可以在CPU上呼叫的函式;

__device__:定義在GPU上,由GPU呼叫函式;

__host__:在CPU上定義的函式,一般與__device__一起用

在GPU上開闢空間:cudaMalloc(**devPtr, byte_size)

如:

int *gpu_int;
cudaMalloc((void**)&gpu_int, sizeof(int))

GPU上陣列的初始化cudaMemset(*devptr, value, byte_size)

GPU、CPU引數傳遞cudaMemcpy(*dst, *src, byte_size, 型別)

其中這個型別包括:

CPU2CPU:cudaMemcpyHostToHost

CPU2GPU:cudaMemcpyHostToDevice

GPU2CPU:cudaMemcpyDeviceToHost

GPU2GPU:cudaMemcpyDeviceToDevice

原始碼如下:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>

using namespace std;

__device__ int add_one(int a) {

	return a + 1;
}

__global__ void show(int *a) {

	for (int i = 0; i < 10; i++) {

		//a[i] = add_one(a[i]);
		printf(" %d", a[i]);
	}
	printf("\n");
}

__global__ void changeValue(int *a) {

	for (int i = 0; i < 10; i++) {

		a[i] = 100;
	}
}

int main() {

	int cpu_int[10] = {10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
	int *gpu_int;

	//在GPU上分配空間
	cudaMalloc((void**)&gpu_int, 10 * sizeof(int));
	show << <1, 1 >> > (gpu_int);

	//初始化其值
	cudaMemset(gpu_int, 0, 10 * sizeof(int));
	show<< <1, 1 >> > (gpu_int);

	//將cpu_int賦值給gpu_int
	cudaMemcpy(gpu_int, cpu_int, 10 * sizeof(int), cudaMemcpyHostToDevice);
	show << <1, 1 >> > (gpu_int);

	//改變gpu_int的值
	changeValue << <1, 1 >> >(gpu_int);
	show << <1, 1 >> > (gpu_int);

	//將gpu_int的值賦值到cpu_int
	cudaMemcpy(cpu_int, gpu_int, 10 * sizeof(int), cudaMemcpyDeviceToHost);
	printf("----------華麗的分割線----------\n");
	for (int i = 0; i < 10; i++) {


		printf(" %d", cpu_int[i]);
	}


	//釋放gpu_int的空間
	cudaFree(gpu_int);


	getchar();
	return 0;
}

程式執行截圖如下:

原始碼打包地址如下:

https://github.com/fengfanchen/CAndCPP/tree/master/HelloCuda