首先声明我这篇主要是根据下面网站的介绍, 加以修改和详细描述,一步一步在我自己的电脑上实现的,

首先要将显卡驱动更新到最新版,以支持opencl 。 要看显卡支不支持opencl,可以下一个 GPU_Caps_Viewer_Setup  软件看一看

首先要下载安装opencl库。我这里下载的是英特尔的。英伟达和AMD的也都差不多。
首先下载INTEL版的opencl驱动:

直接安装即可。
然后下载intel版本的opencl开发工具包

我这里默认安装到  G:\Program Files\Intel\OpenCL SDK  目录下。
安装完成后  G:\Program Files\Intel\OpenCL SDK\3.0  目录下出现以下文档 (include和lib等)


安装好VC 2012
Alt+F7 进行属性设置,或者建完项目后右键项目进行属性设置。
新建Win控制台空项目。右键进行属性设置。

在属性页里面找到“C/C++”的“常规”项,点击,右边有“附加包含目录”,然后编辑,添加目录:




.在属性页里面找到“连接器”,点击其“常规”项,右边有“附加库目录”,然后也是编辑,添加目录:


 在输入选项只用,右边“附加依赖项”,编辑,添加lib文件:OpenCL.lib


这里要注意一点, 如果你用的是64位的系统的话,如果你把OpenCL.lib 的目录指定为......//lib/x64
的话,很很可能还是不能正常编译。这是因为
A fresh install of Visual
Studio (even 2010) uses 32-bit by default, so unless you've explicitly set your project to be 64-bit (in configuration manager -> platform -> x64) it will be 32-bit. 
所以说如果编译不能正常通过的话试着把OpenCL.lib 的目录指定为......//lib/x86
 或者......//lib/Win32
试试。
但是目录还是C:\Program Files  不是C:\Program Files(x86)

比如如果用NVDIA 的CUDA可以这样设定目录
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\lib\Win32



然后添加源文件,源文件如下:

 #include
 #include //包含CL的头文件
 using namespace std;
 
 //根据参数,判断设备类别。是CPU、GPU、ACCELERATOR或其他设备
 const char* GetDeviceType(cl_device_type it)
 {
     if(it == CL_DEVICE_TYPE_CPU)
         return "CPU";
     else if(it== CL_DEVICE_TYPE_GPU)
         return "GPU";
     else if(it==CL_DEVICE_TYPE_ACCELERATOR)
         return "ACCELERATOR";
     else
         return "DEFAULT";
  
 }
  
 int main()
 {
     char dname[512];
     cl_device_id devices[20];
     cl_platform_id* platform_id = NULL;
     cl_uint num_devices;
     cl_device_type int_type;
     cl_ulong long_entries;
     cl_uint num_platform;
     cl_int err;
  
     //查询系统上可用的计算平台,可以理解为初始化
     err = clGetPlatformIDs(0,NULL,&num_platform);
  
     if(err!=CL_SUCCESS)
     {
         cout<<"clGetPlatformIDs error"<<endl;
         return 0;
     }
  
     cout<<"PlatForm num:"<<num_platform<<endl;
  
    unsigned int st=0;
  
     platform_id = new cl_platform_id[num_platform];
  
     err = clGetPlatformIDs(num_platform,platform_id,NULL);
  
     if(err!=CL_SUCCESS)
     {
         cout<<"clGetPlatformIDs error"<<endl;
         return 0;
     }
  
 
for(st=0;st
     {
         cout<<endl<<"----------------------------------"<<endl;
         cout<<"Platform "<<st+1<<endl;
  
         //获取可用计算平台的名称
         clGetPlatformInfo(platform_id[st],CL_PLATFORM_NAME,512,dname,NULL);
         cout<<"CL_PLATFORM_NAME:"<<dname<<endl;
  
         //获取可用计算平台的版本号,即OpenCL的版本号
         clGetPlatformInfo(platform_id[st],CL_PLATFORM_VENDOR,512,dname,NULL);
         cout<<"CL_PLATFORM_VERSION:"<<dname<<endl;
  
         //获取可用计算平台的设备数目
         clGetDeviceIDs(platform_id[st],CL_DEVICE_TYPE_ALL,20,devices,&num_devices);
         cout<<"Device num:"<<num_devices<<endl<<endl;
  
         unsigned int n=0;
  
         //循环两次,检测两个设备的属性
         for(n=0;n
         {
             cout<<endl<<"Device "<<n+1<<endl;
             //获取设备名称
             clGetDeviceInfo(devices[n],CL_DEVICE_NAME,512,dname,NULL);
             cout<<"Device :"<<dname<<endl;
  
             //获取设备类别
             clGetDeviceInfo(devices[n],CL_DEVICE_TYPE,sizeof(cl_device_type),&int_type,NULL);
             cout<<"Device Type:"<<GetDeviceType(int_type)<<endl;
  
             //获取设备版本号
             clGetDeviceInfo(devices[n],CL_DRIVER_VERSION,512,dname,NULL);
             cout<<"Device version:"<<dname<<endl;
  
             //获取设备全局内存大小
             clGetDeviceInfo(devices[n],CL_DEVICE_GLOBAL_MEM_SIZE,sizeof(cl_ulong),&long_entries,NULL);
             cout<<"Device global mem(MB):"<<long_entries/1024/1024<<endl;
  
             //获取设备CACHE内存大小
             clGetDeviceInfo(devices[n],CL_DEVICE_GLOBAL_MEM_CACHE_SIZE,sizeof(cl_ulong),&long_entries,NULL);
             cout<<"Device global mem cache(KB):"<<long_entries/1024<<endl;
  
             //获取本地内存大小
             clGetDeviceInfo(devices[n],CL_DEVICE_LOCAL_MEM_SIZE,sizeof(cl_ulong),&long_entries,NULL);
             cout<<"Device Locale mem(KB) :"<<long_entries/1024<<endl;
  
             //获取设备频率
             clGetDeviceInfo(devices[n],CL_DEVICE_MAX_CLOCK_FREQUENCY,sizeof(cl_ulong),&long_entries,NULL);
             cout<<"Device Max clock(MHz) :"<<long_entries<<endl;
  
             //获取最大工作组数
             clGetDeviceInfo(devices[n],CL_DEVICE_MAX_WORK_GROUP_SIZE,sizeof(cl_ulong),&long_entries,NULL);
             cout<<"Device Max Group size :"<<long_entries<<endl;
  
             //获取最大计算核心数
             clGetDeviceInfo(devices[n],CL_DEVICE_MAX_COMPUTE_UNITS,sizeof(cl_ulong),&long_entries,NULL);
             cout<<"Device Max parallel cores:"<<long_entries<<endl;
  
         }
     }
  
     return 0;
 }

以上程序是检测当前计算机的可用计算平台的相关信息,运行结果如下。


提示复制本代码,编译后若发现提示: 检测到 Mac 文件格式: 请将源文件转换为 DOS 格式或 UNIX 格式, 则在VS中,点文件->高级保存选项,然后在行尾选项中选择windows(CR
LF),重新编译,ok。

还有在查找替换时,在查找选项中启用 正则表达式选项 ,注意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;

【并行计算-CUDA开发】Windows下opencl环境配置的更多相关文章

  1. Windows 下 MSYS2 环境配置和 MinGW-w64 C++ 环境配置

    Windows 下 MSYS2 环境配置和 MinGW-w64 C++ 环境配置 1.简介 本文主要是 Windows 下 MSYS2 环境配置和 MinGW-w64 C++编译环境配置方法 2.下载 ...

  2. windows下JDK环境配置与Android SDK环境配置

    一.JDK环境配置1.配置变量名:JAVA_HOME变量值:jdk安装的绝对路径. 变量名:Path(在系统变量中找到并选中Path点击下面的编辑按钮,不要删除原本变量值中的任何一个字母,在这个变量值 ...

  3. Windows下python环境配置

    步骤: 1.安装Python.Sublime Text: 2.打开Sublime Text,在菜单栏点击“Tools”->“Build System”->“New Build System ...

  4. windows下androidNDK环境配置

    一:什么是NDK? NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so 和java 应用一起打包成apk.这些工具对开发者的帮助是巨大的. NDK 集成了交叉编译器, ...

  5. windows下 Rust 环境配置

    搭建 Visual Studio Code 开发环境 首先,需要安装最新版的 Rust 编译工具和 Visual Studio Code. Rust 编译工具:https://www.rust-lan ...

  6. Windows下Java环境配置,tomcat安装

    问题描述:在Windows下面做Java web相关的项目的时候,Java和tomcat是基础,这里记载一下Java环境的配置以及tomcat的安装和配置. 使用工具:Windows.jdk安装包.t ...

  7. windows下JDK环境配置

    原文地址:http://blog.sina.com.cn/s/blog_618592ea0100oeif.html 一.JDK1.6下载 目前JDK最新版本是JDK1.6,到http://java.s ...

  8. React Native 入门笔记一 -- Windows下基本环境配置

    一.准备工作 首先,需要安装nodejs,可以从nodejs官网下载,注意,React Native 要求node版本在4.0或以上:否则会出错,我建议把node版本升到最新版本,防止后面出现各种莫名 ...

  9. realpython教程之机器学习之Windows下的环境配置

    不得不说,realPython的教程确实写的仔细,准确,有逻辑.果然高质量的学习材料还是更利于学的. 反观我们学校,似乎就有些急功近利了.连Python语言基础都没学,就直接讲深度学习.完全不符合学习 ...

随机推荐

  1. k8s权威指南-从xx到oo的实践全接触

    基本概念与术语 集群的2种管理角色:master和node master 集群的控制节点,负责整个集群的管理与控制,运行着关键进程: 1,k8s api server: 提供了HTTP Rest 接口 ...

  2. join on 和group

                       左边的表是article文章表,右边的是comment文章回复表. 今天mysql查询的时候,遇到了有趣的事,任务是查询数据库需要得到以下格式的文章标题列表,并按 ...

  3. maven的概念-01

    1.maven 简介 maven是Apach软件基金会维护的一款自动化构建工具: 作用是服务于java平台的项目构建和依赖管理:   2.关于项目构建 1)java代码 Java是一门编译型语言,.j ...

  4. 棋盘问题 ( POJ -1321 )(简单DFS)

    转载请注明出处:https://blog.csdn.net/Mercury_Lc/article/details/82684942作者:Mercury_Lc 题目链接 题解:dfs入门,就是每个点都搜 ...

  5. 线性素数筛(欧拉筛)(超级好的MuBan)

    Problem:找出小于等于n的所有素数的个数. #include <bits/stdc++.h> using namespace std; const int maxn = 1e6; i ...

  6. Android 内存 - 获取单个应用内存限制

    方法一: adb shell getprop | grep dalvik.vm.heapgrowthlimit [dalvik.vm.heapgrowthlimit]: [64m] 方法二: Acti ...

  7. MySQL_(Java)【连接池】使用DBCP简单模拟银行转账事物

    dbcp下载 传送门 Commons Pool下载 传送门 Commons log下载 传送门 MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_( ...

  8. CodeForces 714E Sonya and Problem Wihtout a Legend(单调数列和DP的小研究)

    题意:给你n个数字,每个数字可以加减任何数字,付出变化差值的代价,求最后整个序列是严格单调递增的最小的代价. 首先我们要将这个题目进行转化,因为严格单调下是无法用下面这个dp的方法的,因此我们转化成非 ...

  9. BigDecimal的保留位数和四舍五入的方法

    一 BigDecimal num = new BigDecimal("2.225667");//一般都会这样写最好 int count = num.scale(); System. ...

  10. kafka 性能测试脚本

    [参考文章]:Kafka自带的性能测试脚本 1. 生产消息压测脚本 1.1 脚本及参数 bin/kafka-producer-perf-test.sh  --topic kafka-test-0 -- ...