包括 Headers OpenCL(32 位与 64 位)

Include Headers OpenCL (32bit vs 64bit)

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

到目前为止,只要我不将 header 文件包含到我的 OpenCL 内核中,任何事情都可以顺利运行。一旦我将 #include <stdlib.h> 放在我的 header 文件之上,我的 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 位二进制文​​件时,是否还有其他注意事项 OS?

此外:当我的内核以 32 位编译时,我可以使用 64 位浮点数吗? (例如,#pragma OPENCL EXTENSION cl_khr_fp64 : enable 仍然有效吗?)

如果没有:

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

此外: 我的一些 co-workers 甚至怀疑,由于缺少链接器,将标准 C header 包含到 OpenCL 内核中是可能的。对此也表示赞赏。

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

作为标准 C 函数的替代品,OpenCL C 定义了一个集合 built-in 个函数,无需任何 #include 即可使用: printf,大量数学函数,原子,image-related 功能等

查看 "OpenCL Specification: 6.12 Built-in Functions" 完整清单: https://www.khronos.org/registry/OpenCL/specs/opencl-1.2.pdf

这并不意味着您不能使用 OpenCL C 代码创建 header 并将其#include 到 OpenCL C 程序中。这很好用:

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

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