cuda 入門 向量相加

2021-09-22 02:09:34 字數 1618 閱讀 8653

檔名為main.cu

#include#include// 兩個向量加法kernel,grid和block均為一維

__global__ void add(float* x, float * y, float* z, int n)

}int main()

// 申請device記憶體

float *d_x, *d_y, *d_z;

cudamalloc((void**)&d_x, nbytes);

cudamalloc((void**)&d_y, nbytes);

cudamalloc((void**)&d_z, nbytes);

// 將host資料拷貝到device

cudamemcpy((void*)d_x, (void*)x, nbytes, cudamemcpyhosttodevice);

cudamemcpy((void*)d_y, (void*)y, nbytes, cudamemcpyhosttodevice);

// 定義kernel的執行配置

dim3 blocksize(256);

dim3 gridsize((n + blocksize.x - 1) / blocksize.x);

// 執行kernel

add << < gridsize, blocksize >> >(d_x, d_y, d_z, n);

// 將device得到的結果拷貝到host

cudamemcpy((void*)z, (void*)d_z, nbytes, cudamemcpydevicetohost);

cudadevicesynchronize();

// 檢查執行結果

float maxerror = 0.0;

for (int i = 0; i < n; i++)

std::cout << "最大誤差: " << maxerror << std::endl;

// 釋放device記憶體

cudafree(d_x);

cudafree(d_y);

cudafree(d_z);

// 釋放host記憶體

free(x);

free(y);

free(z);

return 0;

}

cmakelists.txt:

cmake_minimum_required(version 3.14)

project(cuda_matrixmulti)

find_package(cuda required)

include_directories(./$

)set(cmake_c_compiler g++)

add_compile_options(-std=c++11)

add_compile_options(-g)

set(src_list main.cu)

cuda_add_executable(cuda_matrixmulti $)

target_link_libraries(cuda_matrixmulti $)

環境說明:ubuntu18 clion cuda9

參考部落格:

cuda實現向量相加

部落格最後附上整體 如果有說的不對的地方還請前輩指出,因為cuda真的接觸沒幾天 cuda 並不純gpu在執行程式,而是 cpu 與 gpu 一起在執行程式,cpu負責排程,gpu 負責運算,cpu稱為 host gpu 稱為device 記住三個東西 grid block thread 關係分別是...

CUDA (一) 基本裝置管理函式 向量相加

lz之前看過一點點的gpu的加速 後來發現要想寫好cuda 對硬體的理解,記憶體的理解,平行計算等要求還是很高的,然後就很慫的放棄了,沒有繼續下去,而且實驗室基本上都是做cv的,很少有同學做hpc,所以對這方面屬於真小白。直到前陣子,去gtc china,也還是小白,cuda也就用過最基礎的cuda...

CUDA( ) 向量求和運算

問題描述 將兩組資料對應的元素兩兩相加,並將結果儲存在第三個陣列中。即向量求和運算 目錄 1.基於cpu的向量求和 分析 問題 索引取值範為0 到 n 1 下面兩種函式add 有什麼區別嗎?完整的 實現及執行結果 2.基於gpu的向量求和 分析 問題 裡面引數式什麼含義?問題 既然gpu將執行ker...