前四章已經講了那麼多的概念,下面該真刀真槍地試一試了。
下面是宿主機端程式:
1234567
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):
123456
__kernel void vector_add(__global
const
int *a, __
global
const
int *b, __
global
int *c)
之後使用命令:
1 gcc -o testtest.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 目...