如何在Linux上运行OpenCL程序(ubuntu 16.04)?

时间:2017-03-16 08:01:23

标签: c linux opencl opencl-c

我正在尝试自己学习OpenCL,而我刚开始学习。现在我正在读这本书OpenCL In Action。 我在我的文件中复制了一个测试代码,但是我无法了解如何运行该代码。也就是说,我该如何编译呢? 在C中,我们使用gcc来输出我们可以运行的文件。 但是在OpenCL with C中,我被困住了。

找不到任何有关如何实际编译的明确信息和逻辑的地方。

这是我想要运行的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <CL/cl.h>

int main() {
cl_platform_id *platforms;
cl_uint num_platforms;
cl_int i, err, platform_index = -1;
char* ext_data;
size_t ext_size;
const char icd_ext[] = "cl_khr_icd";

err = clGetPlatformIDs(1, NULL, &num_platforms);
if(err < 0) {
perror("Couldn't find any platforms.");
exit(1);
}

platforms = (cl_platform_id*)
malloc(sizeof(cl_platform_id) * num_platforms);
clGetPlatformIDs(num_platforms, platforms, NULL);
for(i=0; i<num_platforms; i++) {
err = clGetPlatformInfo(platforms[i],
CL_PLATFORM_EXTENSIONS, 0, NULL, &ext_size);
if(err < 0) {
perror("Couldn't read extension data.");
exit(1);
}

ext_data = (char*)malloc(ext_size);
      clGetPlatformInfo(platforms[i],CL_PLATFORM_EXTENSIONS,ext_size,ext_data,NULL);
printf("Platform %d supports extensions: %s\n",i, ext_data);


if(strstr(ext_data, icd_ext) != NULL) {
free(ext_data);
platform_index = i;
break;
}
free(ext_data);
}

if(platform_index > -1)
printf("Platform %d supports the %s extension.\n",platform_index,icd_ext);
else
printf("No platforms support the %s extension.\n", icd_ext);
free(platforms);
return 0;
}

2 个答案:

答案 0 :(得分:0)

正如上面评论中的UnholySheep所指出的,我们需要将C代码与OpenCL库链接起来。

假设C源文件名为test.c,那么在64位系统上编译它的命令就是;

gcc test.c -lOpenCL -L$AMDAPPSDKROOT/lib/x86_64

更多信息可以从AMD提供的手册中找到: AMD_OpenCL_Programming_User_Guide

本问题的具体部分在用户指南的第3.1.2节中回答如下,

在Linux上编译

  

在Linux,gcc或Intel C编译器上编译OpenCL应用程序   必须安装。有两个主要步骤:编译和链接。   

     
      
  1. 编译所有C ++文件(Template.cpp),并获取目标文件。对于32位系统上的32位目标文件或64位目标文件   64位系统:
    g ++ -o Template.o -c Template.cpp   -I $ AMDAPPSDKROOT / include
    用于在64位系统上构建32位目标文件:
    g ++ -o Template.o -c Template.cpp   -I $ AMDAPPSDKROOT /包括

  2.   
  3. 将上一步生成的所有目标文件链接到OpenCL库并创建可执行文件。
    用于链接到64位   library:
    g ++ -o Template Template.o -lOpenCL   -L $ AMDAPPSDKROOT / lib / x86_64
    用于链接到32位库:
    g ++ -o Template Template.o -lOpenCL -L $ AMDAPPSDKROOT / lib / x86

  4.   

答案 1 :(得分:0)

我在运行Ubuntu 18.04的Dell Inspiron上有一个Intel Kaby Lake GT2 GPU。一旦安装了OpenCL,开发的下一步就是建立并运行一个简单的代码示例。

我首先将概述here的代码放入本地目录,然后使用g ++进行编译

g++ *.cpp -lOpenCL

您的里程会有所不同,您可能还需要包含头文件