包括标头OpenCL(32位和64位)
我编程OpenCL通过在Ubuntu 16.04.3 64位上的pyopenCL,在Nvidia的Tesla K10.G2.8GB上的 。包括标头OpenCL(32位和64位)
到目前为止,只要我没有在我的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
baiscally提示吨o安装libc6-dev-i386
或gcc-multilib
和g++-multilib
,假设潜在问题是64位/ 32位问题。我的问题是,我的GPU的OpenCL二进制文件是否编译为32位二进制文件(如何检查?)?
如果是:
还有没有其他的注意事项,当我想编译一个64位操作系统的32位二进制文件?
此外:当我的内核编译为32位时,我可以使用64位浮点数吗? (例如,将#pragma OPENCL EXTENSION cl_khr_fp64 : enable
还是工作?)
如果没有:
我必须手动定位/复制所有必要的头文件,并用手包括他们?
另外:我的一些同事甚至怀疑,这其中包括标准的C头到OpenCL内核可能是由于缺少连接体。任何灯光也赞赏。
标准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代码 头和#包括它转化为OpenCL C程序。这工作正常:
// foo.h
void foo() {
printf("hello world!");
}
// kernel.cl
#include "foo.h"
__kernel void use_foo() {
foo();
}
我不知道,但我认为OpenCL可能只是语言https://www.khronos.org/files/opencl-1-2-quick-reference-card。pdf和相关资源:https://www.khronos.org/opencl/resources。在我对PyOpenCL非常有限的知识中,我没有在内核中编写或者看到过'#include _any_library_'。 – benshope
在SO上快速搜索'include header openCL',可以发现至少有些人将自己的头文件包含在OpenCL内核代码中。我正在谈论用OpenCL C编写的内核代码(基本上是C的子集) – Dschoni
哦,是的,我想是的。刚刚看到这一个:https://stackoverflow.com/questions/14502925/include-headers-to-opencl-cl-file我会让更多的人了解PyOpenCL回答你的问题... – benshope