Ubuntu下使用AMD APP编写OpenCL程序
对于Ubuntu或其近亲(Lubuntu、Kubuntu、Mint等)编写OpenCL程序也不会太难。由于本例用的是AMD APP SDK,因此需要AMD的GPU以及相关驱动。首先,去AMD官网下载GPU驱动——AMD Catalyst。如果你用的是APU并且还有一块独立显卡的话,通过AMD Catalyst Control Center可以选择使用哪个GPU。像我现在用的联想Z475笔记本,搭载了AMD APU A6-3420M以及一块AMD Radeon HD 7400M,但是相比较而言,还是APU自带的6620G的GPU性能更強一些,因此我这边设置的是采用AMD Radeon HD 6620G。
在Linux下,AMD官方的GPU驱动是.run文件,只需使用sudo sh xxx.run即可安装。安装时采用默认安装即可。
然后去developer.amd.com开发者网站下载AMD APP SDK。下载完成之后,将lib里面的动态库文件(xxx.so)取出来,并且把include里的头文件取出来。在你的OpenCL工程中把头文件的路径以及动态加载库都设置好。在你用-l的时候,如果动态库文件后缀名为.so.1,那么得把文件名后缀.1去掉。因为-l只能连接.a、.lib、.so等这些后缀的库文件。
下面我们将举一个最简单的例子,首先看主机端代码:
/*
============================================================================
Name : OpenCLTest.c
Author : Zenny Chen
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/ #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <CL/cl.h> static int GetCurrentLocationFilePath(char pDst[], const char *filename)
{
if(pDst == NULL || filename == NULL)
return ; int size = readlink("/proc/self/exe", pDst, );
while(pDst[size - ] != '/')
size--; strcpy(&pDst[size], filename);
int retSize = strlen(filename) + size;
pDst[retSize] = '\0'; return retSize;
} int main(void)
{
/*Step1: Getting platforms and choose an available one.*/
cl_uint numPlatforms; //the NO. of platforms
cl_int status = clGetPlatformIDs(, NULL, &numPlatforms);
if (status != CL_SUCCESS)
{
puts("Error: Getting platforms!");
return ;
} cl_platform_id platforms[]; /*For clarity, choose the first available platform. */
if(numPlatforms > )
{
status = clGetPlatformIDs(numPlatforms, platforms, NULL);
if(status != CL_SUCCESS)
{
puts("Failed to get platform IDs");
return ;
}
} /*Step 2:Query the platform and choose the first GPU device if has one.Otherwise use the CPU as device.*/
cl_uint numDevices = ;
cl_device_id devices[];
clGetDeviceIDs(platforms[], CL_DEVICE_TYPE_GPU, , NULL, &numDevices);
if(numDevices == ) //no GPU available.
{
puts("No devices available!");
return ;
}
else
{
printf("The number of available devices is: %u\n", numDevices);
clGetDeviceIDs(platforms[], CL_DEVICE_TYPE_GPU, numDevices, devices, NULL);
} /*Step 3: Create context.*/
cl_context context = clCreateContext(NULL,, devices,NULL,NULL,NULL); /*Step 4: Creating command queue associate with the context.*/
cl_command_queue commandQueue = clCreateCommandQueue(context, devices[], , NULL); /*Step 5: Create program object */
char filePath[];
GetCurrentLocationFilePath(filePath, "test.cl");
FILE *fp = fopen(filePath, "r");
if(fp == NULL)
{
puts("OpenCL kernel source file open failed!");
return ;
}
fseek(fp, , SEEK_END);
long fileLength = ftell(fp);
fseek(fp, , SEEK_SET);
char *source = (char*)malloc(fileLength + );
fread(source, , fileLength, fp);
fclose(fp);
size_t sourceSize[] = {fileLength};
cl_program program = clCreateProgramWithSource(context, , (const char**)&source, sourceSize, NULL); free(source);
if(program == NULL)
{
puts("Failed to create the program!");
return ;
} /*Step 6: Build program. */
status = clBuildProgram(program, ,devices,NULL,NULL,NULL);
if(status != CL_SUCCESS)
{
puts("Failed to build the program!");
return ;
} /*Step 7: Initial input,output for the host and create memory objects for the kernel*/
int input[];
for(int i = ; i < ; i++)
input[i] = i + ; cl_mem inputBuffer = clCreateBuffer(context, CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR, sizeof(input), input, NULL);
cl_mem outputBuffer = clCreateBuffer(context, CL_MEM_WRITE_ONLY , sizeof(input), NULL, NULL); /*Step 8: Create kernel object */
cl_kernel kernel = clCreateKernel(program, "test", NULL); /*Step 9: Sets Kernel arguments.*/
status = clSetKernelArg(kernel, , sizeof(cl_mem), &inputBuffer);
status = clSetKernelArg(kernel, , sizeof(cl_mem), &outputBuffer); /*Step 10: Running the kernel.*/
size_t global_work_size[] = { };
status = clEnqueueNDRangeKernel(commandQueue, kernel, , NULL, global_work_size, NULL, , NULL, NULL); /*Step 11: Read the cout put back to host memory.*/
int output[];
status = clEnqueueReadBuffer(commandQueue, outputBuffer, CL_TRUE, , sizeof(input), output, , NULL, NULL); /*Step 12: Clean the resources.*/
status = clReleaseKernel(kernel); //Release kernel.
status = clReleaseProgram(program); //Release the program object.
status = clReleaseMemObject(inputBuffer); //Release mem object.
status = clReleaseMemObject(outputBuffer);
status = clReleaseCommandQueue(commandQueue); //Release Command queue.
status = clReleaseContext(context); //Release context. for(int i = ; i < ; i++)
{
if(output[i] != i + )
{
printf("Error occurred @%d!", i);
return ;
}
} puts("Pass!");
return ;
}
在编译选项中,使用-std=gnu99或-std=gnu11。上述代码为纯C语言,因此即便你没有安装g++也完全没关系。
下面看看内核源代码:
/*
============================================================================
Name : OpenCLTest.c
Author : Zenny Chen
Version :
Copyright : Your copyright notice
Description : Simple OpenCL kernel source
============================================================================
*/ __kernel void test(__global int* in, __global int* out)
{
int index = get_global_id();
out[index] = in[index] + ;
}
将此文件放在可执行文件相同路径下,然后我们就能正常运行了。
Ubuntu下使用AMD APP编写OpenCL程序的更多相关文章
- (转)Ubuntu下用eclipse cdt编写多线程程序的简单设置
在Ubuntu下用eclipse cdt编写了一个多线程程序,但是总是出现pthread_create函数未定义! 查找了下原因,原来是要对eclipse进行一些简单的设置: 右键单击项目->P ...
- ubuntu下创建第一个rails应用程序
一.创建一个新的应用程序 在控制台输入 > rails new demo create create README.rdoc create Rakefile create config.ru ...
- 关于在ubuntu下配置AMD显卡驱动的总结
同样先卸载先前版本 代码: sudo sh /usr/share/ati/fglrx-uninstall.sh 代码: sudo apt-get remove --purge fglrx fglrx_ ...
- (二)ubuntu下安装Amd RX470驱动
0X:ADM官方下载驱动 https://www.amd.com/en/support 查看本机驱动命令 lspci | grep -i vga 选择自己的驱动 下载对应的版本 现在最新的是:amdg ...
- 在ubuntu下使用eclipse来调试ARM程序
该程序为外部Makefile project,导入到eclipse中来进行编译,之后使用Jlink来进行调试. 这个是因为你在编译的时候没有加-g这个标志,导致没有生成调试文件. 让你指定一个源文件. ...
- ubuntu下opencv CMakeLists.txt编写
# 声明要求的 cmake 最低版本 cmake_minimum_required( VERSION 2.8 ) # 声明一个 cmake 工程 project( pro ) # 设置编译模式 set ...
- Ubuntu下编辑并编译运行c++程序
一.使用vim编辑c++代码: vim hello.cpp 输入如下代码: #include <iostream> using namespace std; int main() { co ...
- ubuntu下安装 Sublime Text 3 及 PlantUML 绘图插件
ubuntu下只想做C++的程序代码编写,最开始选择了codeblock,主要目的是安装简单,集成度高,还可以调试,但是用的时候老是无故退出,改了半天的代码就这样丢失,挺苦恼的,可能跟自己装的系统比较 ...
- Ubuntu下终端Vim编写C语言程序 AAAAA
我是开虚拟机下的Ubuntu,装双系统又卸了,Ubuntu默认是不包含编辑器vim和编译器gcc.如果你是刚安装好的Ubuntu电脑,下面我们将来实现自己的第一个程序. 1.准备工作 首先进入root ...
随机推荐
- Delphi 类类型和对象
- dropbear源码编译安装及AIDE软件监控
ssh协议的另一个实现:dropbear源码编译安装:• 1.安装开发包组:yum groupinstall “Development tools”• 2.下载 -2017.75.tar.bz2 ...
- Hadoop_27_MapReduce_运营商原始日志增强(自定义OutputFormat)
1.需求: 现有一些原始日志需要做增强解析处理,流程: 1. 从原始日志文件中读取数据(日志文件:https://pan.baidu.com/s/12hbDvP7jMu9yE-oLZXvM_g) 2. ...
- 【LOJ6671】EntropyIncreaser 与 Minecraft
Orz lbt Description https://loj.ac/problem/6671 Solution
- HDU 2897 bash 博弈变形
一堆石子N个 每个人最少取P个 最多取Q个 最后取光的人输 问谁赢 X=N%(P+Q) X=0则先手取Q个必胜 X<=P则后手胜 X>P则先手取P个必胜 #include <ios ...
- Java 类的重载/匿名类的使用/可变形参
/** *1.类的方法的重载 *2.匿名类对象的传递和引用 *3.可变个数的形参(格式:1/对于方法的形参: 数据类型...形参名 * 2/可变个数的形参与同名的方法之间构成重载 * 3/可变个数的形 ...
- stat /var/lib/docker/tmp/docker-builder234542842/usr/local/resource/noah_init.sql
参考:https://blog.csdn.net/andrew_wf/article/details/85202511 将noah_init.sql放到与Dockerfile同一目录
- C# 继承(3)持续更新
类继承 和 接口继承 类继承 一个类型派生于一个基类行,它拥有该基类型的所有成员字段和函数. 接口继承 一个类型继承函数的签名,不需要实现代码. 多重继承 一个类派生自多个类.多 ...
- Bootstrap-轮播图-No.6
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- Qt 程序自动重启的实现
正常退出调用exit() 或quit()就行,想要自已重启可按下面代码: void XXX:onRestart() { //类中调用 qApp->exit(); } 主main函数中处理 int ...