OpenCL 4 小試牛刀

2022-09-06 23:42:17 字數 4002 閱讀 5324

前四章已經講了那麼多的概念,下面該真刀真槍地試一試了。

下面是宿主機端程式:

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

7273

7475

7677

7879

8081

8283

8485

8687

8889

9091

9293

9495

#include

#include

#include

#else

#include

#endif

#define max_source_size (0x100000)

intmain

(void)

//載入核心原始碼到source_str

file *fp;

char *source_str;

size_t source_size;

fp=fopen("vector_add_kernel.cl","r");

if (!fp)

source_str=(char*)malloc(max_source_size);

source_size=fread(source_str,1,max_source_size,fp);

fclose(fp);

//獲得平台和裝置資訊

cl_platform_id platform_id=null;

cl_device_id device_id=null;

cl_uint ret_num_devices;

cl_uint ret_num_platforms;

cl_int ret=clgetplatformids(1, &platform_id, &ret_num_platforms);

ret=clgetdeviceids(platform_id, cl_device_type_default, 1, &device_id, &ret_num_devices);

//建立opencl上下文

cl_context context=clcreatecontext(null,1,&device_id,null,null,&ret);

//建立命令佇列

cl_command_queue command_queue=clcreatecommandqueue(context,device_id,0,&ret);

//建立記憶體緩衝物件,在裝置上為每個向量

cl_mem a_mem_obj=clcreatebuffer(context,cl_mem_read_only,

list_size*sizeof(int),null,&ret);

cl_mem b_mem_obj=clcreatebuffer(context,cl_mem_read_only,

list_size*sizeof(int),null,&ret);

cl_mem c_mem_obj=clcreatebuffer(context,cl_mem_write_only,

list_size*sizeof(int),null,&ret);

//拷貝資料a和b到對應的記憶體緩衝

ret=clenqueuewritebuffer(command_queue,a_mem_obj,cl_true,0,

list_size*sizeof(int),a,0,null,null);

ret=clenqueuewritebuffer(command_queue,a_mem_obj,cl_true,0,

list_size*sizeof(int),b,0,null,null);

//建立程式

cl_program program=clcreateprogramwithsource(context,1,

(const

char**)&source_str,(const

size_t*)&source_size, &ret);

//構建程式

ret=clbuildprogram(program,1,&device_id,null,null,null);

//建立opencl核心

cl_kernel kernel=clcreatekernel(program,"vector_add",&ret);

//設定核心引數

ret=clsetkernelarg(kernel,0,sizeof(cl_mem),(void*)&a_mem_obj);

ret=clsetkernelarg(kernel,1,sizeof(cl_mem),(void*)&b_mem_obj);

ret=clsetkernelarg(kernel,2,sizeof(cl_mem),(void*)&c_mem_obj);

//執行核心

size_t global_item_size=list_size; //處理整個列表

size_t local_item_size=64; //分割為64個組

ret=clenqueuendrangekernel(command_queue,kernel,1,null,

&global_item_size,&local_item_size,0,null,null);

//讀取記憶體緩衝c到本地變數c

int *c=(int*)malloc(sizeof(int)*list_size);

ret=clenqueuereadbuffer(command_queue,c_mem_obj,cl_true,0,

list_size*sizeof(int),c,0,null,null);

//顯示結果

for (i=0; iprintf("%d + %d = %d\n", a[i], b[i], c[i]);

}//清理資源

ret=clflush(command_queue);

ret=clfinish(command_queue);

ret=clreleasekernel(kernel);

ret=clreleaseprogram(program);

ret=clreleasememobject(a_mem_obj);

ret=clreleasememobject(b_mem_obj);

ret=clreleasememobject(c_mem_obj);

ret=clreleasecommandqueue(command_queue);

ret=clreleasecontext(context);

free(a);

free(b);

free(c);

return0;}

下面是核心程式(vector_add_kernel.cl):

123

456

__kernel void vector_add(__

global

const

int *a, __

global

const

int *b, __

global

int *c)

之後使用命令:

1

gcc -o test

test.c -i

進行編譯。

boost graph lib 小試牛刀

最近要做社會網路的社群發現,發現用bgl能減少不少 量。經過一番調研發現bgl封裝的很牛叉,dijkstra等演算法統統具備,奈何自己對泛型程式設計不太熟,遇到問題還是很糾結。primer泛型程式設計 演算法部分和stl原始碼分析接下來有時間一定要讀下。下面僅以鄰接鍊錶和自定義節點為例 typede...

Anti Debug 小試牛刀

本文整理了日常生活中遇到的一些anti debug技術,除非特殊說明,均適用於mac ios開發 作為第一篇正式博文,會不定期更新,謝謝大家.123 4567 89 define pt deny attach 31 include intmain 程式正常執行,會輸出hello 但是程式載入到gdb...

tsung小試牛刀

linux環境 centos5.5 1 tsung安裝 tar zxvf tsung 1.4.2.tar.gz configure make sudo make install 安裝後執行 which tsung,如果顯示 usr bin tsung 表明安裝成功 2 設定 如果沒有 tsung 目...