注意:安裝完畢後opencl的sdk在路徑c:\program files (x86)\intel\opencl sdk\6.3下
第一步:檢驗計算機硬體裝置
安裝完畢檢驗硬體裝置,檢視平台數量,**如下:
#include #include #include //包含cl的標頭檔案
using namespace std;
//根據引數,判斷裝置類別。是cpu、gpu、accelerator或其他裝置
const char* getdevicetype(cl_device_type it)
int main()
cout << "platform num:" << num_platform << endl;
int st = 0;
platform_id = new cl_platform_id[num_platform];
err = clgetplatformids(num_platform, platform_id, null);
if (err != cl_success)
for (st = 0; st如果發現cpu的opencl版本為實驗版本2.1,需要runtime配置檔案,安裝即可。
再次檢驗硬體裝置,檢視平台數量,可以發現cpu的opencl版本正確。
第二步:矩陣運算加速
**如下:
核函式vecadd.cl檔案如下:
__kernel void vecadd(__global int* a,
__global int* b,
__global int* c)
主函式main.cpp檔案如下:
#include #include #include #include #include #include //包含cl的標頭檔案
//opencl 2.1
//solve problem: error c4996: 'clcreatecommandqueue': 被宣告為已否決
#pragma warning( disable : 4996 )
using namespace std;
//100維向量
#define elements 100
//從外部檔案獲取cl核心**
bool getfiledata(const char* fname, string& str)
int n = 0;
while (feof(fp) == 0)
return true;
}int main()
char* buf_code = new char[code_file.size()];
strcpy(buf_code, code_file.c_str());
buf_code[code_file.size() - 1] = null;
//宣告cl所需變數。
cl_device_id device;
cl_platform_id *platform_id = null;
cl_context context;
cl_command_queue cmdqueue;
cl_mem buffera, bufferb, bufferc;
cl_program program;
cl_kernel kernel = null;
//我們使用的是一維向量
//設定向量大小(維數)
size_t globalworksize[1];
globalworksize[0] = elements;
cl_int err;
//定義輸入變數和輸出變數,並設定初值
int* buf_a = new int[elements];
int* buf_b = new int[elements];
int* buf_c = new int[elements];
size_t datasize = sizeof(int) * elements;
for (int i = 0; i < elements; i++)
//step 1:初始化opencl
cl_uint num_platform;
err = clgetplatformids(0, null, &num_platform);
platform_id = new cl_platform_id[num_platform];
err = clgetplatformids(num_platform, platform_id, null);
if (err != cl_success)
//博主計算機三個plantform,platform_id[2]為cpu,根據情況來改
clgetdeviceids(platform_id[2], cl_device_type_cpu, 1, &device, null);
//step 2:建立上下文
context = clcreatecontext(null, 1, &device, null, null, null);
//step 3:建立命令佇列
cmdqueue = clcreatecommandqueue(context, device, 0, null);
//step 4:建立資料緩衝區
buffera = clcreatebuffer(context, cl_mem_read_only, datasize, null, null);
bufferb = clcreatebuffer(context, cl_mem_read_only, datasize, null, null);
bufferc = clcreatebuffer(context, cl_mem_write_only, datasize, null, null);
//step 5:將資料上傳到緩衝區
clenqueuewritebuffer(cmdqueue, buffera, cl_false, 0, datasize, buf_a, 0, null, null);
clenqueuewritebuffer(cmdqueue, bufferb, cl_false, 0, datasize, buf_b, 0, null, null);
//step 6:載入編譯**,建立核心呼叫函式
program = clcreateprogramwithsource(context, 1, (const char**)&buf_code, null, null);
clbuildprogram(program, 1, &device, null, null, null);
kernel = clcreatekernel(program, "vecadd", null);
//step 7:設定引數,執行核心
clsetkernelarg(kernel, 0, sizeof(cl_mem), &buffera);
clsetkernelarg(kernel, 1, sizeof(cl_mem), &bufferb);
clsetkernelarg(kernel, 2, sizeof(cl_mem), &bufferc);
clenqueuendrangekernel(cmdqueue, kernel, 1, null, globalworksize, null, 0, null, null);
//step 8:取回計算結果
clenqueuereadbuffer(cmdqueue, bufferc, cl_true, 0, datasize, buf_c, 0, null, null);
//輸出驗證結果
cout << buf_a[0] << "+" << buf_b[0] << "=" << buf_c[0] << endl;
cout << buf_a[elements - 1] << "+" << buf_b[elements - 1] << "=" << buf_c[elements - 1] << endl;
//釋放所有呼叫和記憶體
clreleasekernel(kernel);
clreleaseprogram(program);
clreleasecommandqueue(cmdqueue);
clreleasememobject(buffera);
clreleasememobject(bufferb);
clreleasememobject(bufferc);
clreleasecontext(context);
deleteplatform_id;
deletebuf_a;
deletebuf_b;
deletebuf_c;
deletebuf_code;
system("pause");
return 0;
}
測試結果顯示如下:
任何問題**
唯一qq
2258205918
(名稱samylee)!
或唯一vx:samylee_csdn
OpenCL加速矩陣運算
opencl運用並行的方法加速矩陣運算,在業界得到廣泛運用,博主也試了一試,挺好玩的。注意 1 opencl針對的資料量越大,加速效果越明顯 2 opencl版本測試在nvidia730上,cuda7.5下的opencl檔案,windows7 3 opencl sdk位於c program file...
模板 矩陣加速(數列)(矩陣加速遞推)
a 1 a 2 a 3 1 a x a x 3 a x 1 x 3 求a數列的第n項對1000000007 10 9 7 取餘的值。輸入格式 第一行乙個整數t,表示詢問個數。以下t行,每行乙個正整數n。輸出格式 每行輸出乙個非負整數表示答案。矩陣加速裸題 和我的前一篇基本一模一樣 只不過改變了要乘的...
DP 矩陣加速
題目 hiho第43周 hiho1162 題意 現有1 2的骨牌,求覆蓋k n的方案數。2 k 7,1 n 100,000,000 方法 dp,用矩陣快速冪加速 dp矩陣加速的基本思想即將一系列狀態看成乙個向量,轉移方程看成乙個矩陣,通過向量乘矩陣得出下一系列狀態,即當 由於k較小,可以用狀壓思想構...