cuda編程入門-HelloWorld

爲了提高並行運算速度,開始接觸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 運行結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章