AMD APP,是AMD Accelerated Parallel Processing的缩写。中文译作AMD加速并行处理技术。是AMD针对旗下图形处理器(GPU)所推出的通用并行计算技术。利用这种技术可以充分发挥AMD GPU的并行运算能力,用于对软件进行加速运算或进行大型的科学运算。AMD APP技术的前身称作ATI Stream。2010年10月,随着AMD Radeon HD6800系列显卡的发布,ATI品牌正式被AMD取代。ATI Stream技术也随着技术升级并更名为AMD APP技术。AMD APP的竞争对手是nVIDIA CUDA。(来自百度百科)
AMD最近发布了支持最新的OpenCL 2.0标准的最新通用计算开发包AMD APP SDK 3.0。这标志着异构计算发展道路上的一个新的里程碑。OpenCL 2.0实施了很多AMD所倡导的新的异构系统架构。值得注意的是,GPU和CPU设备之间的数据结构指针内存共享的概念可以大大地简化GPU参与加速计算的步骤。比起利用OpenCL 1.2,GPU设备利用了OpenCL 2.0排队功能进行计算任务,为计算内核提供了一种更加强悍的编程模型。OpenCL 1.2的通用地址空间是一个强大的编程优势,但是OpenCL 2.0 引用了一种新的内存对象,叫Pipe,这个在采用FIFO机制进行数据采集时起到重要的作用。OpenCL的这些还有其他优势将会帮助你利用现代异构系统性能的巨大潜力。
使用之前,先看看是否有OpenCL 2.0所支持的AMD显卡型号,AMD Radeon HD 7790, AMD Radeon HD 8770, AMD Radeon HD 8500M/8600M/8700M/8800M/8900M Series(本人用的是8690M), AMD Radeon R5 M240, AMD Radeon R7 200 Series, AMD Radeon R9 290, AMD Radeon R9 290X, A-Series AMD Radeon R4 Graphics, A-Series AMD Radeon R5 Graphics, A-Series AMD Radeon R6 Graphics, A-Series AMD Radeon R7 Graphics, AMD FirePro W5100, AMD FirePro W9100, AMD FirePro S9150。
支持的操作系统:
1、Microsoft®
Windows®Win 7 (32/64 bits) and 8.1 (32/64 bits)
2、Linux®
openSUSE™ 13.1 (32-bit/64-bit)
Ubuntu® 14.04 LTS, 14.10 (32-bit/64-bit)
Red Hat® Enterprise
Linux® 7.0, 6.4, 6.5 (32-bit/64-bit)
支持的编译环境:
1、Microsoft®
Windows®Intel® C Compiler (ICC) 11.x;
Microsoft® Visual Studio® (MSVS) 2012 Professional Edition;
Microsoft® Visual Studio® (MSVS) 2010 Professional Edition;
Microsoft® Visual Studio® (MSVS) 2008 Professional Edition;
Minimalist GNU for Windows (MinGW) [GCC 4.4];
Microsoft® Visual Studio® (MSVS) 2013 Professional Edition
2、Linux®
Linux GNU Compiler Collection (GCC) 4.7.1 or later
官网下载地址:http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/
由于该SDK分为Linux 32 Linux 64 和windows 三个版本,所以在下载时得看清楚。Linux平台上的是离线安装包,Windows下的是在线安装管理器。虽然都不大,但是从官网下载源的下载地址都很慢,特别是Windows下的在线安装包不支持断点续传,所以比较麻烦。所以下面给出在线安装包下载AMD-SDKInstaller-v1.2.116-Beta-windows-F-x86.exe的官方下载源地址和百度网盘的下载地址。
官方下载地址:amd-dev.wpengine.netdna-cdn.com/app-sdk/installers/UnifiedSDKInstaller/1.2-Beta/full/AMD-SDKInstaller-v1.2.116-Beta-windows-F-x86.exe
百度网盘地址:http://pan.baidu.com/s/1qWx7mzU
AMD APP SDK包只包含了CPU runtime,GPU runtime包含在了Catalyst driver中。默认的安装路径是C:\Program Files\AMD APP SDK\3.0-0-Beta,在操作系统中安装了以下三部分内容:
1、AMD APP SDK CPU Runtime
2、AMD APP SDK Developer component。
这包含了以下两部分内容:
---opencl编译器
---最新版开发指南文件,AMD math libraries。
包含了以下四个文件夹(C:\Program Files\AMD APP SDK\3.0-0-Beta):
---bin包含了编译opencl应用所需工具以及运行所需opencl动态库
---lib包含了基本的opencl CPU运行库
---include包含了opencl运行的头文件
---docs包含了AMD APP SDK开发文档
3、AMD APP SDK Samples。这包含了以下两部分:
---sample applications
---sample documentation
另外,AMD APP SDK安装会自动添加变量AMDAPPSDKROOT到环境中去,这也指明了CPU Run-time 文件的安装位置。sample applications被安装在默认路径或者用户指定路径,安装过程也自动添加了opencl动态库的路径LD_LIBRARY_PATH到系统环境变量中去。
安装前对系统的需求:
1、管理员权限
2、windows 8.1或者windows 7
3、Microsoft Visual Studio 2012 redistributable
4、具备以下一种ideMicrosoft Visual Studio 2010, Microsoft Visual Studio 2012, or Microsoft Visual Studio 2013.
5、为了创建Bolt samples,需要Microsoft Visual Studio 2010或者Microsoft Visual Studio 2012
6、DirectX samples需要windows sdk 8.0及以上
7、c++ AMP samples需要Microsoft Visual Studio 2012及以上。
在windows system中,选择的安装文件如下,
–32位机 AMD-SDKInstaller-v1.
–64位机 AMD-SDKInstaller-v1.
安装过程,我们一般选择默认路径就行,直接点下一步完成安装。如果选择默认自动安装,那么会自动生成变量
AMDAPPSDKROOT=C:\Program Files\AMD APP SDK\3.0-0-Beta\(32位机)
AMDAPPSDKROOT=C:\Program Files(x86)\AMD APP SDK\3.0-0-Beta\(64位机)。
如果不是选择默认安装路径,那么就需要人为修改。
系统环境变量PATH需要作如下修改,32位机和64位机分别添加
$(AMDAPPSDKROOT)\bin\x86,对应的就是C:\Program Files\AMD APP SDK\3.0-0-Beta\bin\x86
$(AMDAPPSDKROOT)\bin\x86_64,对应的就是C:\Program Files(x86)\AMD APP SDK\3.0-0-Beta\bin\x86_64
安装好AMDAPPSDK之后,在命令行下运行clinfo命令,将显示出你支持OpenCL的硬件信息。
#include
#include
#define NWITEMS 512
//A simple memset kernel
const char *source =
"__kernel void memset( __global uint *dst ) \n"
"{ \n"
" dst[get_global_id(0)] = get_global_id(0); \n"
"} \n";
int main(int argc, char ** argv)
{
// 1. Get a platform.
cl_platform_id platform;
clGetPlatformIDs( 1, &platform, NULL );
// 2. Find a gpu device.
cl_device_id device;
clGetDeviceIDs( platform, CL_DEVICE_TYPE_GPU,1,&device,NULL);
// 3. Create a context and command queue on that device.
cl_context context = clCreateContext( NULL, 1, &device, NULL, NULL, NULL);
cl_command_queue queue = clCreateCommandQueue( context, device, 0, NULL );
// 4. Perform runtime source compilation, and obtain kernel entry point.
cl_program program = clCreateProgramWithSource( context, 1, &source, NULL, NULL );
clBuildProgram( program, 1, &device, NULL, NULL, NULL );
cl_kernel kernel = clCreateKernel( program, "memset", NULL );
// 5. Create a data buffer.
cl_mem buffer = clCreateBuffer( context, CL_MEM_WRITE_ONLY, NWITEMS*sizeof(cl_float), NULL, NULL);
// 6. Launch the kernel. Let OpenCL pick the local work size.
size_t global_work_size = NWITEMS;
clSetKernelArg(kernel, 0, sizeof(buffer), (void*) &buffer);
clEnqueueNDRangeKernel( queue, kernel, 1, NULL, &global_work_size, NULL, 0, NULL, NULL);
clFinish( queue );
// 7. Look at the results via synchronous buffer map.
cl_uint *ptr;
ptr = (cl_uint *) clEnqueueMapBuffer( queue, buffer, CL_TRUE, CL_MAP_READ, 0, NWITEMS * sizeof(cl_uint), 0, NULL, NULL, NULL );
int i;
for(i=0; i < NWITEMS; i++)
printf("%d %d\n", i, ptr[i]);
return 0;
}
不出意外的话,编译过不了,有下面的提示。
fatal error C1083: Cannot open include file: 'Cl/cl.h': No such file or directory
$(AMDAPPSDKROOT)/include;
1>SimpleProject.obj : error LNK2019: unresolved external symbol _clGetPlatformIDs@12 referenced in function _main
1>SimpleProject.obj : error LNK2019: unresolved external symbol _clGetDeviceIDs@24 referenced in function _main
1>SimpleProject.obj : error LNK2019: unresolved external symbol _clCreateContext@24 referenced in function _main
1>SimpleProject.obj : error LNK2019: unresolved external symbol _clCreateBuffer@24 referenced in function _main
1>SimpleProject.obj : error LNK2019: unresolved external symbol _clCreateProgramWithSource@20 referenced in function _main
1>SimpleProject.obj : error LNK2019: unresolved external symbol _clBuildProgram@24 referenced in function _main
1>SimpleProject.obj : error LNK2019: unresolved external symbol _clCreateKernel@12 referenced in function _main
1>SimpleProject.obj : error LNK2019: unresolved external symbol _clSetKernelArg@16 referenced in function _main
1>SimpleProject.obj : error LNK2019: unresolved external symbol _clFinish@4 referenced in function _main
1>SimpleProject.obj : error LNK2019: unresolved external symbol _clEnqueueMapBuffer@44 referenced in function _main
1>SimpleProject.obj : error LNK2019: unresolved external symbol _clEnqueueNDRangeKernel@36 referenced in function _main
1>SimpleProject.obj : error LNK2019: unresolved external symbol _clCreateCommandQueue@20 referenced in function _main
$(AMDAPPSDKROOT)\lib\x86\;
在Linker -> Input ->Additional Dependencies中选择Edit,然后添加
OpenCL.lib
Inherited values中默认的值应该为:
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib