繁体   English   中英

包括标头OpenCL(32位和64位)

[英]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-i386gcc-multilibg++-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM