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...