包括 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-i386
或gcc-multilib
和g++-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();
}
我在 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-i386
或gcc-multilib
和g++-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();
}