OpenCL CPU加速矩陣運算

2021-08-02 22:53:02 字數 4512 閱讀 9982

注意:安裝完畢後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較小,可以用狀壓思想構...