hello OpenCL 向量相加(2)

2021-08-24 23:59:31 字數 1698 閱讀 1927

nvidia安裝後的opencl例子多是c++的,而且使用了cuda提供的一些函式(通過包含oclutils.h),[url= programming overview[/url]提供了2個例子,分別是向量相加、n體問題模擬。

#include 

#include

// 注意這裡

#include

#define len(arr) sizeof(arr) / sizeof(arr[0])

// 裝置端kernel源程式,以字串陣列的方式儲存,在某些論壇中提示每個語句最好以回車結束;

// 在執行時從原始碼編譯成可執行在gpu上的kernel**

const char* src = \n"

};int main()

;float srcb = ;

float dst[n];

// 設定kernel的輸入輸出引數,詳見opencl規範5.2.1節

cl_mem memobjs[3];

memobjs[0] = clcreatebuffer(context, cl_mem_read_only | cl_mem_copy_host_ptr, sizeof(float) * n, srca, null);

memobjs[1] = clcreatebuffer(context, cl_mem_read_only | cl_mem_copy_host_ptr, sizeof(float) * n, srcb, null);

memobjs[2] = clcreatebuffer(context, cl_mem_write_only, sizeof(float) * n, null, null);

// set "a", "b", "c" vector argument,詳見opencl規範5.5.2節

err = clsetkernelarg(kernel, 0, sizeof(cl_mem), (void *)&memobjs[0]);

err |= clsetkernelarg(kernel, 1, sizeof(cl_mem), (void *)&memobjs[1]);

err |= clsetkernelarg(kernel, 2, sizeof(cl_mem), (void *)&memobjs[2]);

size_t global_work_size[1] = ;

// execute kernel,詳見opencl規範6.1節

err = clenqueuendrangekernel(cmd_queue, kernel, 1, null, global_work_size, null, 0, null, null);

// read output array,詳見opencl規範5.2.2節

err = clenqueuereadbuffer(cmd_queue, memobjs[2], cl_true, 0, n*sizeof(cl_float), dst, 0, null, null);

for (int i=0; i %.2f\n", dst[i]);

}return 0;

}

編譯:gcc vec_add.c -lopencl -std=c99

參考:[list=1]

[*][url= programming overview[/url]

[*][url=規範和api 1.0[/url]

[/list]

cuda 入門 向量相加

檔名為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...

cuda實現向量相加

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

原生python與numpy陣列向量相加效率對比

原生python與numpy陣列向量相加效率對比 計算乙個資料元素的平方與立方之和 1 原生python 向量相加 原生python def pythonvector n a range n b range n c for i in range len a a i i 2 b i i 3 retur...