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 ...
随机推荐
- vue 之img的src是动态渲染时(即 :src=' ' )不显示 踩坑
问题: <img :src="item.image ? `../../assets/image/${item.image}` : ''" alt="image&qu ...
- 命令行工具--netstat
目录 netstat命令使用 一.简介 二.安装 三.常见参数 四.使用案例 1.列出所有端口(包括监听和为监听的) 2.列出所有 tcp 端口 3.列出所有 udp 端口 4.列出正在监听的端口 5 ...
- djnago中间件
前言 在form表单中当我们提交表单时会有这样的错误>>>>请求post时候的会出现403 forbidden,那我们就说说这个类中间件,(csrf只是中间件的一种) 以前我们 ...
- MySQL安装步骤及环境变量配置
MySQL安装 MySQL下载地址:http://dev.mysql.com/downloads/installer/1:首先进入的是安装引导界面2:然后进入的是类型选择界面,这里有3个类型:Typi ...
- 十三:MVC-HTML辅助方法-输出表单
ASP.NET MVC框架内置多个表单相关的HTML辅助方法 HTML辅助方法 说明 Html.BeginForm() 输出<form>标签 Html.CheckBox() 输出<i ...
- 遍历二叉树 - 基于栈的DFS
之前已经学过二叉树的DFS的遍历算法[http://www.cnblogs.com/webor2006/p/7244499.html],当时是基于递归来实现的,这次利用栈不用递归也来实现DFS的遍历, ...
- R中数据的输入和数据的标注
数据的导入 默认情况下数据导入时,字符型变量将转化为因子.若不希望转化,可设置 stringsAsFactors=FALSE 从带分隔符的文本文件中导入数据 read.table() file --& ...
- BZOJ 2458: [BeiJing2011]最小三角形 (分治)
分治就是了. 类似于分治找最近/远点对. CODE #include <bits/stdc++.h> using namespace std; const double eps = 1e- ...
- Codeforces Round #590 (Div. 3) B2. Social Network (hard version)
链接: https://codeforces.com/contest/1234/problem/B2 题意: The only difference between easy and hard ver ...
- AtCoder AGC001D Arrays and Palindrome (构造)
补一下原来做过的AtCoder思维题的题解 题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_d 先特判一些小的情况. 原题就相当于每个回文串 ...