cuda筆記-第一個cuda程式
阿新 • • 發佈:2020-12-14
這裡先說明下一些基本概念:
釋放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