对于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程序的更多相关文章

  1. (转)Ubuntu下用eclipse cdt编写多线程程序的简单设置

    在Ubuntu下用eclipse cdt编写了一个多线程程序,但是总是出现pthread_create函数未定义! 查找了下原因,原来是要对eclipse进行一些简单的设置: 右键单击项目->P ...

  2. ubuntu下创建第一个rails应用程序

    一.创建一个新的应用程序 在控制台输入 > rails new  demo create create README.rdoc create Rakefile create config.ru ...

  3. 关于在ubuntu下配置AMD显卡驱动的总结

    同样先卸载先前版本 代码: sudo sh /usr/share/ati/fglrx-uninstall.sh 代码: sudo apt-get remove --purge fglrx fglrx_ ...

  4. (二)ubuntu下安装Amd RX470驱动

    0X:ADM官方下载驱动 https://www.amd.com/en/support 查看本机驱动命令 lspci | grep -i vga 选择自己的驱动 下载对应的版本 现在最新的是:amdg ...

  5. 在ubuntu下使用eclipse来调试ARM程序

    该程序为外部Makefile project,导入到eclipse中来进行编译,之后使用Jlink来进行调试. 这个是因为你在编译的时候没有加-g这个标志,导致没有生成调试文件. 让你指定一个源文件. ...

  6. ubuntu下opencv CMakeLists.txt编写

    # 声明要求的 cmake 最低版本 cmake_minimum_required( VERSION 2.8 ) # 声明一个 cmake 工程 project( pro ) # 设置编译模式 set ...

  7. Ubuntu下编辑并编译运行c++程序

    一.使用vim编辑c++代码: vim hello.cpp 输入如下代码: #include <iostream> using namespace std; int main() { co ...

  8. ubuntu下安装 Sublime Text 3 及 PlantUML 绘图插件

    ubuntu下只想做C++的程序代码编写,最开始选择了codeblock,主要目的是安装简单,集成度高,还可以调试,但是用的时候老是无故退出,改了半天的代码就这样丢失,挺苦恼的,可能跟自己装的系统比较 ...

  9. Ubuntu下终端Vim编写C语言程序 AAAAA

    我是开虚拟机下的Ubuntu,装双系统又卸了,Ubuntu默认是不包含编辑器vim和编译器gcc.如果你是刚安装好的Ubuntu电脑,下面我们将来实现自己的第一个程序. 1.准备工作 首先进入root ...

随机推荐

  1. Delphi 类类型和对象

  2. dropbear源码编译安装及AIDE软件监控

    ssh协议的另一个实现:dropbear源码编译安装:• 1.安装开发包组:yum groupinstall “Development tools”• 2.下载 -2017.75.tar.bz2    ...

  3. Hadoop_27_MapReduce_运营商原始日志增强(自定义OutputFormat)

    1.需求: 现有一些原始日志需要做增强解析处理,流程: 1. 从原始日志文件中读取数据(日志文件:https://pan.baidu.com/s/12hbDvP7jMu9yE-oLZXvM_g) 2. ...

  4. 【LOJ6671】EntropyIncreaser 与 Minecraft

    Orz lbt Description https://loj.ac/problem/6671 Solution

  5. HDU 2897 bash 博弈变形

    一堆石子N个 每个人最少取P个 最多取Q个 最后取光的人输 问谁赢 X=N%(P+Q)  X=0则先手取Q个必胜 X<=P则后手胜 X>P则先手取P个必胜 #include <ios ...

  6. Java 类的重载/匿名类的使用/可变形参

    /** *1.类的方法的重载 *2.匿名类对象的传递和引用 *3.可变个数的形参(格式:1/对于方法的形参: 数据类型...形参名 * 2/可变个数的形参与同名的方法之间构成重载 * 3/可变个数的形 ...

  7. 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同一目录

  8. C# 继承(3)持续更新

    类继承 和 接口继承 类继承        一个类型派生于一个基类行,它拥有该基类型的所有成员字段和函数. 接口继承     一个类型继承函数的签名,不需要实现代码. 多重继承 一个类派生自多个类.多 ...

  9. Bootstrap-轮播图-No.6

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  10. Qt 程序自动重启的实现

    正常退出调用exit() 或quit()就行,想要自已重启可按下面代码: void XXX:onRestart() { //类中调用 qApp->exit(); } 主main函数中处理 int ...