爲了提高並行運算速度,開始接觸cuda編程,cuda 在安裝的時候提供了很多示例,一般位於Home目錄下,可以作爲學習的參考,同時官網提供的入門教程,就是很好的學習資料。
cuda編程首先要轉換與cpu 下編程的思想,在cpu 下,我們一般都是按照順序進行執行,或者開幾個線程處理幾個任務,而在gpu 下,是分block 和 thread的,gpu由多個block(x,y ,z )組成,每個block 下由多了thread組成,都是根據ID進行區分操作,這樣可以把一個任務拆分成很多個線程去執行。
作爲學習,我新建了cuda 文件項目,cmake 進行文件管理,目錄結構如下:
入門的項目爲helloWorld,主程序在main.cu中
本例子對兩個整數求和。
最外層的CMakeLists.txt 管理用到的包和頭文件
project("cuda")
cmake_minimum_required(VERSION 2.8)
# 查找cuda 文件
find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS})
#add_subdirectory(addVector)
add_subdirectory(helloWorld)
helloWorld 文件中的CMakeLists.txt
project(helloWorld)
cuda_add_executable(helloWorld main.cu)
main.cu 中的代碼:
#include <stdio.h>
// CUDA runtime
#include <cuda_runtime.h>
// __global__ 聲明 gpu 線程調用
__global__ void sum(int *a, int *b, int *c ){
c[0] = a[0] + b[0];
}
int main(int argc, char **argv)
{
// 聲明 Host 變量
int a[1]={1},b[1] ={2},c[1]={0};
// 聲明 device 變量
int *gpu_a, *gpu_b, *gpu_c;
// 開闢空間
cudaMalloc((void **)&gpu_a, sizeof(int));
cudaMalloc((void **)&gpu_b, sizeof(int));
cudaMalloc((void **)&gpu_c, sizeof(int));
// 講Host 數據上載到gpu上
cudaMemcpy(gpu_a, a, sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(gpu_b, b, sizeof(int), cudaMemcpyHostToDevice);
// 執行
sum<<<1, 1>>>(gpu_a, gpu_b, gpu_c);
// 將執行結果 下載到Host 變量 c中
cudaMemcpy(c, gpu_c, sizeof(int), cudaMemcpyDeviceToHost);
// 釋放空間
cudaFree(gpu_a);
cudaFree(gpu_b);
cudaFree(gpu_c);
// 打印
printf(" %d + %d = %d \n", a[0], b[0], c[0]);
return 0;
}
最後 CMake Make 運行結果: