【问题标题】:Include Headers OpenCL (32bit vs 64bit)包括头文件 OpenCL(32 位与 64 位)
【发布时间】:2018-03-07 07:16:24
【问题描述】:

我在 Ubuntu 16.04.3 64 位上通过 pyopenCL 编程 OpenCL, 在 Nvidia 的 Tesla K10.G2.8GB 上。

到目前为止,只要我不将头文件包含到我的 OpenCL 内核中,任何事情都可以顺利运行。一旦我将#include <stdlib.h> 放在我的头文件顶部,我的openCL 内核的编译就会失败,并且缺少不同的文件,其中包括

gnu/stubs-32.h
sys/cdefs.h

搜索那个问题,找到类似的答案

Error "gnu/stubs-32.h: No such file or directory" while compiling Nachos source code

https://askubuntu.com/questions/470796/fatal-error-sys-cdefs-h-no-such-file-or-directory

一般建议安装libc6-dev-i386gcc-multilibg++-multilib,假设根本问题是64 位/32 位问题。我的问题是,我用于 GPU 的 OpenCL 二进制文件是否编译为 32 位二进制文​​件(如何检查?)?

如果是:

当我想在 64 位操作系统上编译 32 位二进制文​​件时,还有其他注意事项吗?

此外:当我的内核编译为 32 位时,我可以使用 64 位浮点数吗? (例如,#pragma OPENCL EXTENSION cl_khr_fp64 : enable 还能工作吗?)

如果没有:

我是否必须手动定位/复制所有需要的头文件并手动包含它们?

另外:我的一些同事甚至怀疑,由于缺少链接器,将标准 C 标头包含到 OpenCL 内核中是可能的。任何有关这方面的信息也值得赞赏。

【问题讨论】:

  • 我不确定,但我认为 OpenCL 可能只是语言 khronos.org/files/opencl-1-2-quick-reference-card.pdf 和相关资源:khronos.org/opencl/resources。在我对 PyOpenCL 的了解非常有限的情况下,我还没有在内核中编写或见过 #include _any_library_
  • 在 SO 上快速搜索 include header openCL 会发现至少有些人将自己的头文件包含在 OpenCL 内核代码中。我说的是用 OpenCL C(基本上是 C 的子集)编写的内核代码
  • 哦,是的,我想是的。刚看到这个:stackoverflow.com/questions/14502925/…我会让更了解 PyOpenCL 的人回答你的问题...

标签: c include opencl 32bit-64bit pyopencl


【解决方案1】:

不能包含标准 C 库和其他系统头文件 进入 OpenCL C 代码,基本上是因为它们只兼容 使用当前系统(主机),而 OpenCL C 代码可以 在具有不同架构的不同设备上运行(GPU 在 你的情况)。

作为标准 C 函数的替代品,OpenCL C 定义了一个集合 内置函数,无需任何#include 即可使用: printf,大量数学函数,原子,图像相关 函数等

请参阅“OpenCL 规范:6.12 内置函数”了解 完整清单: https://www.khronos.org/registry/OpenCL/specs/opencl-1.2.pdf

这并不意味着您不能使用 OpenCL C 代码创建标头 并将其#include 到 OpenCL C 程序中。这工作正常:

// foo.h
void foo() {
  printf("hello world!");
}

// kernel.cl
#include "foo.h"
__kernel void use_foo() {
  foo();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2011-09-24
    相关资源
    最近更新 更多