【问题标题】:How to run OpenCL programs on Linux (ubuntu 16.04)?如何在 Linux (ubuntu 16.04) 上运行 OpenCL 程序?
【发布时间】:2017-08-07 06:54:46
【问题描述】:

我正在尝试自己学习 OpenCL,而我才刚刚开始。现在我正在阅读这本书 OpenCL In Action。 我已经在我的文件中复制了一个测试代码,但我无法掌握如何运行该代码。也就是说,我该如何编译它? 在 C 语言中,我们使用 gcc 来获取我们可以运行的文件。 但是在使用 C 的 OpenCL 中,我被卡住了。

在实际编译的背后找不到任何具有明确信息和逻辑的地方。

这是我要运行的代码:

#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;
}

【问题讨论】:

  • 你尝试过做什么?无论如何,OpenCL 内核通常在运行时编译。唯一的区别是您需要将 C 代码与 OpenCL 库链接。
  • 我刚刚更改了代码。请你再看看好吗
  • 我还是不明白那个代码有什么问题 - 你说你不知道如何编译它,那我应该在那个代码中看到什么?
  • 抱歉误导,我的sdk位于/opt/AMDAPPSDK-3.0,我链接哪个库?
  • 查看 AMDAPPSDK 的用户指南 - 第 3.1.2 节 在 Linux 上编译amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/… - 它包含包含头文件和链接到库的说明

标签: c linux opencl opencl-c


【解决方案1】:

我的戴尔 Inspiron 上有一个英特尔 Kaby Lake GT2 GPU,它运行 Ubuntu 18.04。安装 OpenCL 后,开发的下一步就是启动并运行一个简单的代码示例。

我先把here的代码放到本地目录下,然后用g++编译

g++ *.cpp -lOpenCL

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

【讨论】:

    【解决方案2】:

    正如上面在 cmets 中 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/include

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      相关资源
      最近更新 更多