包含标题OpenCL(32位对64位)

时间:2017-09-26 07:22:10

标签: c include opencl 32bit-64bit pyopencl

我在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-i386gcc-multilibg++-multilib,假设基本问题是64位/ 32位问题。我的问题是,我的GPU的OpenCL二进制文件是否编译为32位二进制文​​件(我该如何检查?)?

如果是:

当我想在64位操作系统上编译32位二进制文​​件时还有其他注意事项吗?

此外:当我的内核以32位编译时,我可以使用64位浮点数吗? (例如,#pragma OPENCL EXTENSION cl_khr_fp64 : enable仍会有效吗?)

如果不是:

我是否必须手动定位/复制所有需要的头文件并手动包含它们?

另外:我的一些同事甚至怀疑,由于缺少链接器,包括OpenCL内核的标准C头是可能的。对此的任何启示也表示赞赏。

1 个答案:

答案 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();
}