我在Ubuntu 16.04.3 64bit上通过pyopenCL编程OpenCL, 在Nvidia的特斯拉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-i386
或gcc-multilib
和g++-multilib
,假设基本问题是64位/ 32位问题。我的问题是,我的GPU的OpenCL二进制文件是否编译为32位二进制文件(我该如何检查?)?
如果是:
当我想在64位操作系统上编译32位二进制文件时还有其他注意事项吗?
此外:当我的内核以32位编译时,我可以使用64位浮点数吗?
(例如,#pragma OPENCL EXTENSION cl_khr_fp64 : enable
仍会有效吗?)
如果不是:
我是否必须手动定位/复制所有需要的头文件并手动包含它们?
另外:我的一些同事甚至怀疑,由于缺少链接器,包括OpenCL内核的标准C头是可能的。对此的任何启示也表示赞赏。
答案 0 :(得分:3)
不能包含标准C库和其他系统头 进入OpenCL C代码,主要是因为它们只兼容 使用当前系统(主机),而OpenCL C代码可以 在具有不同架构的不同设备上运行(GPU中的 你的情况)。
作为标准C函数的替代,OpenCL C定义了一个集合 内置函数,没有任何#include: printf,大量的数学函数,原子,图像相关 功能等
参见&#34; OpenCL规范:6.12内置函数&#34;为一个 完整清单: 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();
}