OpenCL Hello World
▶ OpenCL 的环境配置与第一个程序
● CUDA 中自带 OpenCL 需要的头文件和库,直接拉近项目里边去就行;AMD 需要下载 AMD APP SDK(https://community.amd.com/message/2739800 和 http://hc.csdn.net/resources/resource_detail?id=13,感谢大神们提供的方便渠道)
▶ CUDA - OpenCL 在Visual Studio 2015 中的配置。注意 32 位项目和 64 位项目的属性选项不共享,添加的文件也不相同,应该先选定项目的位数,再进行配置。
● VS项目属性右键,属性,C/C++ 目录,包含目录,添加 CUDA 的头文件目录,我的是 "D:\Program\CUDA9.0\include" ,一般代码中使用 #inlcude <CL/cl.h> 来包含子目录中的头文件,也可将其 CL 子目录直接写在这里, "D:\Program\CUDA9.0\include\CL"
● VS项目属性右键,属性,C/C++ 目录,库目录,添加 CUDA 的库目录,注意 32 位和64位是不同的,32位 "D:\Program\CUDA9.0\lib\Win32",64位 "D:\Program\CUDA9.0\lib\x64",使用错误的库文件在编译时会显示类似 “错误 LNK2019 无法解析的外部符号 clGetPlatformInfo,该符号在函数 main 中被引用” 的错误。

● VS项目属性右键,属性,链接器,输入,附加依赖项,添加 OpenCL.lib

▶ AMD APP SDK - OpenCL 在Visual Studio 2015 中的配置。跟上面 CUDA - OpenCL 的差不多,也需要添加头文件位置,库位置和链接器输入,注意区分 32 位项目和 64 位项目。
● 在办公室的垃圾电脑上完成了配置,相关目录如下:"C:\Program Files %28x86%29\AMD APP SDK\3.0\include","C:\Program Files %28x86%29\AMD APP SDK\3.0\include\CL","C:\Program Files (x86)\AMD APP SDK\3.0\lib\x86_64"
● 我直接按照上面的配置运行时,遇到函数 clGetPlatformIDs() 时报内存错误(0x0FD9F73C (XXX.dll)处(位于 OpenCL.exe 中)引发的异常: 0xC0000005: 读取位置 0x00000001 时发生访问冲突。),与动态库有关。这时需要在 "C:\Windows\SysWOW64" 或 "C:\Windows\System32" 下更新 igdrcl32.dll igdrcl64.dll 才行(随便找了一个较新的版本替换掉它)。
▶ 第一个程序,访问计算平台,输出相关信息
● 代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cl.h> // OpenCL 的头文件 int main()
{
cl_platform_id *pPlatform; // 平台数据结构数组,每个结构表示一个在主机上的 OpenCL 执行平台(执行设备)
cl_uint nPlatform;
cl_int i, err;
char* extraInformation; // 额外信息缓冲区
size_t extraSize; // 额外信息缓冲区大小
bool supportICD = false; // 记录主机是否支持 OpenCL Installable Client Driver (ICD) // platform工作的步骤:0、询问主机上有多少计算平台;1、为平台数据结构分配内存空间;2、初始化这些数据结构
if (err = clGetPlatformIDs(, NULL, &nPlatform) < )// 查询平台数,返回值非零说明调用错误,参数:1、需要的平台数上限;2、NULL 表查询平台总数;3、输出平台数的变量指针
{
perror("Couldn't find any pPlatform."); // 输出错误信息用的函数
exit();
}
printf("Platform count: %d\n", nPlatform); pPlatform = (cl_platform_id*)malloc(sizeof(cl_platform_id) * nPlatform);// 创建主机数据结构
clGetPlatformIDs(nPlatform, pPlatform, NULL); // 初始化结构 for (i = ; i < nPlatform; i++) // 循环获取平台信息
{
if (err = clGetPlatformInfo(pPlatform[i], CL_PLATFORM_EXTENSIONS, , NULL, &extraSize) < ) // 获取额外信息,第五个参数为信息长度
{
perror("Couldn't read extension data.");
exit();
}
printf("\nExtension data size: %d\n", extraSize); extraInformation = (char*)malloc(extraSize); // 输出信息缓存
clGetPlatformInfo(pPlatform[i], CL_PLATFORM_EXTENSIONS, extraSize, extraInformation, NULL); // 获取相关信息,第二参数为信息内容,这里是OpenCL支持的扩展功能信息
printf("Platform %d supports extensions: %s\n", i, extraInformation);
if (strstr(extraInformation, "cl_khr_icd") != NULL) // 检查是否支持 ICD,支持则输出平台编号
{
printf("\nPlatform %d supports ICD extension.\n", i);
supportICD = true;
}
clGetPlatformInfo(pPlatform[i], CL_PLATFORM_NAME, extraSize, extraInformation, NULL); // 产商名
printf("Platform %d name: %s\n", i, extraInformation);
clGetPlatformInfo(pPlatform[i], CL_PLATFORM_VENDOR, extraSize, extraInformation, NULL); // 供应商名
printf("Platform %d vendor: %s\n", i, extraInformation);
clGetPlatformInfo(pPlatform[i], CL_PLATFORM_VERSION, extraSize, extraInformation, NULL); // OpenCL版本
printf("Platform %d version: %s\n", i, extraInformation);
clGetPlatformInfo(pPlatform[i], CL_PLATFORM_PROFILE, extraSize, extraInformation, NULL); // 完整模式 / 嵌入式
printf("Profile: %s\n", extraInformation);
free(extraInformation);
}
if (!supportICD)
printf("\nNo platform support ICD extension.\n");
free(pPlatform);
getchar();
return ;
}
● 输出结果,我的电脑。核显被物理屏蔽,仅检测到独立显卡,仅支持到 OpenCL1.2
Platform count: Extension data size:
Platform supports extensions: cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_fp64 cl_khr_byte_addressable_store cl_khr_icd cl_khr_gl_sharing cl_nv_compiler_options cl_nv_device_attribute_query cl_nv_pragma_unroll cl_nv_d3d10_sharing cl_khr_d3d10_sharing cl_nv_d3d11_sharing cl_nv_copy_opts cl_nv_create_buffer Platform supports ICD extension.
Platform name: NVIDIA CUDA
Platform vendor: NVIDIA Corporation
Platform version: OpenCL 1.2 CUDA 9.1.
Profile: FULL_PROFILE
● 输出结果,办公室的电脑。检测到独立显卡(支持到 OpenCL2.0)和核显(支持到OpenCL1.2)
Platform count: Extension data size:
Platform supports extensions: cl_khr_icd cl_khr_d3d10_sharing cl_khr_d3d11_sharing cl_khr_dx9_media_sharing cl_amd_event_callback cl_amd_offline_devices Platform supports ICD extension.
Platform name: AMD Accelerated Parallel Processing
Platform vendor: Advanced Micro Devices, Inc.
Platform version: OpenCL 2.0 AMD-APP (1800.11)
Profile: FULL_PROFILE Extension data size:
Platform supports extensions: cl_khr_icd cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_byte_addressable_store cl_khr_depth_images cl_khr_3d_image_writes cl_intel_exec_by_local_thread cl_khr_spir cl_khr_dx9_media_sharing cl_intel_dx9_media_sharing cl_khr_d3d11_sharing cl_khr_gl_sharing cl_khr_fp64 Platform supports ICD extension.
Platform name: Intel(R) OpenCL
Platform vendor: Intel(R) Corporation
Platform version: OpenCL 1.2
Profile: FULL_PROFILE
● 用到的函数和定义
// cl_platform.h
// 标量类型
typedef signed __int8 cl_char;
typedef unsigned __int8 cl_uchar;
typedef signed __int16 cl_short;
typedef unsigned __int16 cl_ushort;
typedef signed __int32 cl_int;
typedef unsigned __int32 cl_uint;
typedef signed __int64 cl_long;
typedef unsigned __int64 cl_ulong;
typedef unsigned __int16 cl_half;
typedef float cl_float;
typedef double cl_double; // 平台数据结构函数
extern CL_API_ENTRY cl_int CL_API_CALL clGetPlatformIDs(// 查询平台数和初始化平台数据结构
cl_uint, // 需要的平台数上限
cl_platform_id *, // 传入指针,NULL 表查询平台总数,非 NULL 表初始化平台数据结构
cl_uint * // 输出指针,指向保存了平台数量的变量
) CL_API_SUFFIX__VERSION_1_0; // 版本号?只是一个宏 extern CL_API_ENTRY cl_int CL_API_CALL clGetPlatformInfo(// 获取平台信息
cl_platform_id, // 平台数据结构
cl_platform_info, // 需要查询的信息名
size_t, // 输出缓冲区大小(Byte),首次调用时采用 0
void *, // 输出信息的缓冲区指针,首次调用时采用 NULL
size_t * // 输出信息需要的缓冲区大小(Byte),首次调用使用该变量来获得所需缓冲区的大小
) CL_API_SUFFIX__VERSION_1_0; // 各种可以查询的信息名,含义见代码中
#define CL_PLATFORM_PROFILE 0x0900
#define CL_PLATFORM_VERSION 0x0901
#define CL_PLATFORM_NAME 0x0902
#define CL_PLATFORM_VENDOR 0x0903
#define CL_PLATFORM_EXTENSIONS 0x0904 // stdio.h
_ACRTIMP void __cdecl perror(_In_opt_z_ char const* _ErrorMessage);// 输出错误信息 // vcruntime.h
typedef unsigned __int64 size_t;// size_t 的定义
OpenCL Hello World的更多相关文章
- 基于SoCkit的opencl实验1-基础例程
基于SoCkit的opencl实验1-基础例程 准备软硬件 Arrow SoCkit Board 4GB or larger microSD Card Quartus II v14.1 SoCEDS ...
- OPenCL
OpenCLhttp://baike.baidu.com/link?url=7uHWCVUYB3Sau_xh3OOKP-A08_IvmT1SJixdAXKezCuCfkzeSQDiSmesGyVGk8 ...
- Opencl 并行求和
上周尝试用opencl求极大值,在网上查到大多是求和,所谓的reduction算法.不过思路是一样的. CPP: ; unsigned ; ; ; int nGroup = nGroupSize / ...
- opencl初体验
总结一下,opencl的步骤差不多是这些 先要获取平台的id clGetPlatformIDs(nPlatforms, platform_id, &num_of_platforms) 然后获取 ...
- Altera OpenCL用于计算机领域的13个经典案例(转)
英文出自:Streamcomputing 转自:http://www.csdn.net/article/2013-10-29/2817319-the-application-areas-opencl- ...
- 面向OPENCL的ALTERA SDK
面向OPENCL的ALTERA SDK 使用面向开放计算语言 (OpenCL™) 的 Altera® SDK,用户可以抽象出传统的硬件 FPGA 开发流程,采用更快.更高层面的软件开发流程.在基于 x ...
- OpenCV GPU CUDA OpenCL 配置
首先,正确安装OpenCV,并且通过测试. 我理解GPU的环境配置由3个主要步骤构成. 1. 生成关联文件,即makefile或工程文件 2. 编译生成与使用硬件相关的库文件,包括动态.静态库文件. ...
- CUDA/OpenCL 学习资料
VS2010 NVIDIA OpenCL 开发环境配置 CUDA 在线课程 [经典培训] 全球首套中文CUDA 教程-胡文美教授主讲
- opencl 学习资源
1.AMD opencl-optimization-guide http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated ...
- opencl gauss filter优化(三)
1.根据前两次的最终结果: 使用普通buffer,Horizontal 5ms, Vertical 17 ms 使用image buffer:Horizontal 9.4ms, Vertical 6. ...
随机推荐
- C#使用(NamedPipe)命名管道通信的例子
https://blog.csdn.net/yl2isoft/article/details/20228279
- 自行申请德国的VAT号码?
我在香港/大陆地区,是否可以自行申请德国的VAT号码? 德国联邦税务局按照不同国家申请人划分成不同申请办公室,以下为德国联邦税务局负责中国境内申请人的办公室地址及联络方式: FINANZAMT BER ...
- UVALive-3415 Guardian of Decency (最大独立集)
题目大意:一个老师要带一些学生去春游,但是要带的学生中任意两个人都满足下面四个条件中的至少一个:1.性别相同:2.身高差大与40公分:3.最喜欢的音乐类型不同:4.最喜欢的体育运动相同.问老师最多能带 ...
- poj3814
题解: 所以poj只放了一组数据? 打表(花费了我无数心血找的的打标) 代码: #include <stdio.h> int main(){ printf("1\n2\n1\n2 ...
- ES6学习一 JS语言增强篇
一 背景 JavaScript经过二十来年年的发展,由最初简单的交互脚本语言,发展到今天的富客户端交互,后端服务器处理,跨平台(Native),以及小程序等等的应用.JS的角色越来越重要,处理场景越来 ...
- 在JavaScript中进行文件处理,第四部分:对象URLs
译注:原文是<JavaScript高级程序设计>的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考.原文链接:这里 学习到这里,你已经了解在传统方式中如何使用文件, ...
- 在jenkins和sonar中集成jacoco(二)--在jenkins中生成jacoco覆盖率报告
先要在jenkins上安装jacoco的插件,安装完成之后在job的配置项中可以增加这个选项: 第一个录入框是你的覆盖率文件(exec),第二个是class文件目录,第三个是源代码文件目录. 配置好了 ...
- 关于poi操作excel我使用的一些修饰操作
被这情况恶心了.我的excel默认为常规,然后写入数字就成类似number类型,获取值得到的是double类型,2变成2.0.号码变成科学计数法. 做功能找了一段时间,保存下来防止忘记下次浪费时间. ...
- DIY远程控制开关(tiny6410+LED+yeelink+curl)
上一次,介绍了如何实现远程监控室内温度,大家伙反响还是很热烈的,笔者很欣慰,独乐乐不如众乐乐啊.不过话说回来,那个实现只能是远程监测家中温度,假如发现家里热得很,想远程打开空调开关提前降降温,回家后不 ...
- [UOJ46][清华集训2014]玄学
uoj description 给出\(n\)个变换,第\(i\)个变换是将区间中\(l_i,r_i\)的数\(x\)变成\((a_ix+b_i)\mod m\). 每次会新增一个变换,或者查询询问如 ...