对于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.cAuthor      : Zenny ChenVersion     :Copyright   : Your copyright noticeDescription : 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[512], const char *filename)
{if(pDst == NULL || filename == NULL)return 0;int size = readlink("/proc/self/exe", pDst, 512);while(pDst[size - 1] != '/')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 platformscl_int  status = clGetPlatformIDs(0, NULL, &numPlatforms);if (status != CL_SUCCESS){puts("Error: Getting platforms!");return 0;}cl_platform_id platforms[16];/*For clarity, choose the first available platform. */if(numPlatforms > 0){status = clGetPlatformIDs(numPlatforms, platforms, NULL);if(status != CL_SUCCESS){puts("Failed to get platform IDs");return 0;}}/*Step 2:Query the platform and choose the first GPU device if has one.Otherwise use the CPU as device.*/cl_uint             numDevices = 0;cl_device_id        devices[16];clGetDeviceIDs(platforms[0], CL_DEVICE_TYPE_GPU, 0, NULL, &numDevices);if(numDevices == 0)    //no GPU available.
    {puts("No devices available!");return 0;}else{printf("The number of available devices is: %u\n", numDevices);clGetDeviceIDs(platforms[0], CL_DEVICE_TYPE_GPU, numDevices, devices, NULL);}/*Step 3: Create context.*/cl_context context = clCreateContext(NULL,1, devices,NULL,NULL,NULL);/*Step 4: Creating command queue associate with the context.*/cl_command_queue commandQueue = clCreateCommandQueue(context, devices[0], 0, NULL);/*Step 5: Create program object */char filePath[512];GetCurrentLocationFilePath(filePath, "test.cl");FILE *fp = fopen(filePath, "r");if(fp == NULL){puts("OpenCL kernel source file open failed!");return 0;}fseek(fp, 0, SEEK_END);long fileLength = ftell(fp);fseek(fp, 0, SEEK_SET);char *source = (char*)malloc(fileLength + 1);fread(source, 1, fileLength, fp);fclose(fp);size_t sourceSize[] = {fileLength};cl_program program = clCreateProgramWithSource(context, 1, (const char**)&source, sourceSize, NULL);free(source);if(program == NULL){puts("Failed to create the program!");return 0;}/*Step 6: Build program. */status = clBuildProgram(program, 1,devices,NULL,NULL,NULL);if(status != CL_SUCCESS){puts("Failed to build the program!");return 0;}/*Step 7: Initial input,output for the host and create memory objects for the kernel*/int input[128];for(int i = 0; i < 128; i++)input[i] = i + 1;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, 0, sizeof(cl_mem), &inputBuffer);status = clSetKernelArg(kernel, 1, sizeof(cl_mem), &outputBuffer);/*Step 10: Running the kernel.*/size_t global_work_size[1] = { 128 };status = clEnqueueNDRangeKernel(commandQueue, kernel, 1, NULL, global_work_size, NULL, 0, NULL, NULL);/*Step 11: Read the cout put back to host memory.*/int output[128];status = clEnqueueReadBuffer(commandQueue, outputBuffer, CL_TRUE, 0, sizeof(input), output, 0, 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 = 0; i < 128; i++){if(output[i] != i + 2){printf("Error occurred @%d!", i);return 0;}}puts("Pass!");return 1;
}

在编译选项中,使用-std=gnu99或-std=gnu11。上述代码为纯C语言,因此即便你没有安装g++也完全没关系。

下面看看内核源代码:

/*============================================================================Name        : OpenCLTest.cAuthor      : Zenny ChenVersion     :Copyright   : Your copyright noticeDescription : Simple OpenCL kernel source============================================================================*/__kernel void test(__global int* in, __global int* out)
{int index = get_global_id(0);out[index] = in[index] + 1;
}

将此文件放在可执行文件相同路径下,然后我们就能正常运行了。

Ubuntu下使用AMD APP编写OpenCL程序相关推荐

  1. [Linux]Ubuntu下用apt-get安装的应用程序位置

    Ubuntu下用apt-get安装的应用程序的可执行文件默认放到/usr/bin目录下. 比如: 运行eclipse命令,如果出现:"程序eclipse未安装",这样我们可以执行: ...

  2. windows下如何使用QT编写dll程序 .

    Windows 下如何使用 QT 编写 dll 程序 因为 QT 必须有调用 QApplication 的 exec 方法,这样才能产生消息循环, QT 的程序才可以运行.所以说如果我们使用了 QT ...

  3. ubuntu系统中用c语言编写简单程序

    目录 (一):修改参数提高下载速度 (二):c语言入门编写helloworld (三):在ubuntu系统下编写简单程序 (四):在windows系统下编写简单程序 (五):在ubuntu系统下使用m ...

  4. ubuntu 下安装AMD显卡驱动

    悲催Ubuntu 16.04版本开始,AMD官方的Catalyst Linux (fglrx)显卡驱动将在这个流行的Linux发行版中彻底消失. 这两天在笔记本(Aspire-4560)上安装了lin ...

  5. Ubuntu下为AMD 5700/5700XT安装显卡驱动

    前情:本人前段时间将显卡由AMD RX470更换为AMD 5700,在一段时间后重新开启Ubuntu后,发现显示器分辨率为1366*768.下意识认为是显卡驱动未更新成功,试过使用update及upg ...

  6. ubuntu下如何自动启动U盘脚本程序(autorun)

    windows 下的autorun 在windows中,做个插入U盘及运行的文件名为autorun.inf,用笔记本打开或新建在U盘的根目录下,其内容大致如下: [autorun] icon=tupi ...

  7. Linux环境下安装python并编写简单程序

    本项目以python 3.9.12为例(最新版本可能会有些兼容性问题,所以我们不选择最新版本) 在Linux(ubuntu)环境下进行安装python并编写简单的程序,输出自己的名字 1.在官网进行下 ...

  8. ubuntu进入桌面自动启动脚本_在 Ubuntu 下开机自启动自己的 QT 程序而不启动 Ubuntu 的桌面...

    1. /etc/profile 方式 实现这个功能,要完成两步: 1.系统设置-> 用户账户-> 点击我的账户-> 点击右上角的解锁-> 打开自动登录-> 点击右上角的锁 ...

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

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

最新文章

  1. 在导入graphsurgeon时报错:ImportError: cannot import name ‘NodeDef‘ from ‘tensorflow‘
  2. linux用户层驱动--VFIO(四)
  3. MRI骨水肿是早期未分化关节炎演变为RA的独立预测预测因素
  4. 【转载】要有梦想-创造卓越的职业生涯
  5. android http 慢,android httpurlconnection數據連接速度慢
  6. layui怎样将响应数据展示在页面_layui怎么对弹出层显示数据
  7. 一对电话线传输100M带宽不再是问题
  8. 使用Python批量替换指定目录所有文件中的指定文本
  9. SWIFT显示底部的工具条
  10. 六石编程学:功能要定期测试
  11. .mmap文件用什么软件可以打开?
  12. redis源码阅读—hyperloglog(基数统计)
  13. 鸿蒙系统王维,以少总多,意余于象——王维《终南山》赏析
  14. Echarts 漏斗图
  15. http 411错误
  16. 生日悖论与Hash函数的攻击
  17. oppop+r1c怎么设置语言中文,OPPO R1C怎么样 OPPO R1C手机评测 (全文)
  18. 好乐买总裁李树斌:我的第一次失败(Songtaste创始人)
  19. 【作品展示】双向热电偶热电阻分度表软件
  20. 什么是DDOS攻击?

热门文章

  1. 【转】DPDK(一):专业术语
  2. 川农计算机网络题库,川农网院20秋《计算机网络》期末机考
  3. java中处理打折率_【JAVA300例】13、输入价格判断折扣,switch用法+int留整数方便判断...
  4. SparkStreaming -Kafka数据源
  5. CTF爬虫:掌握这些特征,一秒识别密文加密方式
  6. doc文件转换html,HTML+CSS入门 如何使用POI将doc文件转换为HTML
  7. android手机设置时间设置,如何设置电信定制手机日期与时间
  8. 观看实验中微型计算机虚拟拆装演示,虚拟仿真实验 北斗一号微机原理虚拟仿真实验系统64位 v3.0...
  9. 【LeetCode - 1047】删除字符串中的所有相邻重复项(栈)
  10. 【PAT - 甲级1155】Heap Paths (30分)(栈,dfs,二叉树)