[英]Include Headers OpenCL (32bit vs 64bit)
我在Nvidia的Tesla K10.G2.8GB上的Ubuntu 16.04.3 64bit上通过pyopenCL编程OpenCL。
到目前为止,只要我不将头文件包含在OpenCL内核中,一切就可以顺利进行。 一旦我将#include <stdlib.h>
放在头文件的顶部,我的openCL内核的编译就会失败,并丢失其他文件,其中包括
gnu/stubs-32.h
sys/cdefs.h
搜索该问题,会弹出诸如
编译Nachos源代码时出现错误“ gnu / stubs-32.h:没有这样的文件或目录”
要么
https://askubuntu.com/questions/470796/fatal-error-sys-cdefs-h-no-such-file-or-directory
baiscally建议安装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代码创建标头并将其#include到OpenCL C程序中。 这很好用:
// foo.h
void foo() {
printf("hello world!");
}
// kernel.cl
#include "foo.h"
__kernel void use_foo() {
foo();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.