【并行计算-CUDA开发】Windows下opencl环境配置
首先下载INTEL版的opencl驱动:
还有在查找替换时,在查找选项中启用 正则表达式选项 ,注意windows下的换行符是 /n 而不是\n
opencl编码流程
摘自opencl异构计算:
(1)初始化opencl 平台(调用两次clGetPlatformIDs函数)
第一次获取可用的平台数量,第二次获取一个可用的平台。
(2) 选择设备(调用两次clGetDeviceIDs函数)
第一次获取可用的设备数量,第二次获取一个可用的设备。
(3)创建上下文(调用clCreateContext函数)
Context:环境上下文,一个Context包含几个device(单个Cpu或GPU),一个Context就是这些device的一个联系纽带,只有在一个Context上的那些Device才能彼此交流工作,你的机器上可以同时存在很多Context。你可以用一个CPu创建context,也可以用一个CPU和一个GPU创建一个。
(4)创建命令队列(调用clCreateCommandQueue函数)
(5)创建数据缓冲区(调用clCreateBuffer函数)
(6)将 host数据写进设备缓冲区(调用clEnqueueWriteBuffer函数)
(7)创建程序对象(调用clCreateProgramWithSource函数)并编译内核源码(调用clBuildProgram函数,如果编译成功,则把编译代码存储在程序对象中)
(8)创建kernel(调用clCreateKernel函数)
(9)设置内核参数(调用clSetKernelArg函数)
(10)Configure the work-item structure(设置worksize)//只在分组的时候用到,只调用全局id的时候不要设置
(11)内核入队执行(调用clEnqueueNDRangeKernel函数)
(12)取回计算结果。Read the output buffer back to the host(调用clEnqueueReadBuffer函数)
(13)Release OpenCL resources(至此结束整个运行过程)
中间有很多地方需要结合实际情况进行设定。
//step 1:初始化OpenCL
err = clGetPlatformIDs(1,&platform_id,NULL);
if(err!=CL_SUCCESS)
{
cout<<"clGetPlatformIDs error"<<endl;
return 0;
}
////step 2:创建上下文。这次我们只用CPU来进行并行运算,当然你也可以该成GPU
clGetDeviceIDs(platform_id,CL_DEVICE_TYPE_CPU,1,&device,NULL);
//step 3:创建上下文
context = clCreateContext(NULL,1,&device,NULL,NULL,NULL);
//step 4:创建命令队列
cmdQueue = clCreateCommandQueue(context,device,0,NULL);
//step 5:创建数据缓冲区,即创建内存对象,内存对象分配在设备内存中,可以有内核函数直接调用
bufferA = clCreateBuffer(context,
CL_MEM_READ_ONLY,
datasize,NULL,NULL);
bufferB = clCreateBuffer(context,
CL_MEM_READ_ONLY,
datasize,NULL,NULL);
//step 6:将数据上传到缓冲区,注意这里只传A,相当于赋值,B 是结果,不需要初始化了
clEnqueueWriteBuffer(cmdQueue,
bufferA,CL_FALSE,
0,datasize,
buf_A,0,
NULL,NULL);
//step 7:由内核源代码创建程序对象.
program = clCreateProgramWithSource(context,1,
(const char**)&buf_code,
NULL,NULL);
//调用clBuildProgram函数,编译内核源代码。如果编译成功,则把编译代码存储在程序对象中
clBuildProgram(program,1,&device,NULL,NULL,NULL);
//step 8:创建内核对象
kernel = clCreateKernel(program,"transposition",NULL);
//step 9:设置参数,执行内核
clSetKernelArg(kernel,0,sizeof(cl_mem),&bufferA);
clSetKernelArg(kernel,1,sizeof(cl_mem),&bufferB);
//step 10:内核入队执行。注意这里第三个参数已经改成2,表示二维数据。
clEnqueueNDRangeKernel(cmdQueue,kernel,
2,NULL,
globalWorkSize,
NULL,0,NULL,NULL);
//step 11:取回计算结果
clEnqueueReadBuffer(cmdQueue,bufferB,CL_TRUE,0,
datasize,buf_B,0,NULL,NULL);
//输出计算结果
for(n=0;n
{
for(m=0;m
{
cout<< buf_A[m][n] <<",";
}
cout<<endl;
}
cout<<endl<<"====transposition===="<<endl<<endl;
for(n=0;n
{
for(m=0;m
{
cout<< buf_B[m][n] <<",";
}
cout<<endl;
}
//step 12:释放所有调用和内存
clReleaseKernel(kernel);
clReleaseProgram(program);
clReleaseCommandQueue(cmdQueue);
clReleaseMemObject(bufferA);
clReleaseMemObject(bufferB);
clReleaseContext(context);
delete buf_code;
return 0;
相关文章
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)
- Win10还原被Windows Defender隔离的文件
- Flutter 桌面应用开发配置与打包 Flutter Windows 桌面软件开发
- Windows下Android开发环境配置
- xmpp 服务器配置 open fire for windows 及 spark 测试
- caffe初试(一)happynear的caffe-windows版本的配置及遇到的问题
- [转]windows下nacos的配置使用
- windows下安装和配置SNMP
- Windows Server 2012 R2在硬盘的分区
- windows下安装,配置gcc编译器
- windows安装程序无法将windows配置为在此计算机上运行
- windows制作macos的U盘启动
- Windows下配置Tomcat服务器
- Windows下配置Java开发环境
- 使用Duilib开发Windows软件(2)——控件的基本介绍
- 【微信小程序】全局配置和windows节点常用配置
- RabbitMQ镜像+脑裂配置方法windows版,亲测后编写的公司文档
- Windows下IDEA run能运行springboot,java -jar maven打的包拉有中文的nacos配置,报org.yaml.snakeyaml.error.YAMLException错误解决
- Windows两个网卡配置路由规则 同时访问内网和外网
- windows下启动nacos(单机配置)
- windows下配置apache+https
- Windows里配置Apache2.2+PHP5.3+mod_fcgid运行高效的FastCGI模式
- 在windows下安装配置python开发环境及Ulipad开发工具(转)
- Synergy 多系统共享鼠标键盘 Windows 和 Mac 完全配置教程
- windows下spark开发环境配置
- 五角大楼怒赞Windows 10:不用都不好意思跟别人打招呼
- Python系列之Windows环境安装配置
- Windows 64bit下Python环境配置与集成IDE PyCharm
- windows 配置 apache的多个站点