包含标头 OpenCL(32 位与 64 位)

问题描述 投票:0回答:2

我是在 Ubuntu 16.04.3 64 位上通过 pyopenCL 编程 OpenCL, 在 Nvidia 的 Tesla K10.G2.8GB 上。

到目前为止,只要我不将头文件包含到 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

基本建议安装

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 include opencl 32bit-64bit pyopencl
2个回答
3
投票

不能包含标准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();
}

0
投票

OpenCL 明确规定了内核中库的使用。请参阅 OpenCL API 文档中的

cl_program clLinkProgram(...)

但是,任何库都必须针对运行该库的处理器进行编译。 如果您在多核CPU上运行内核,在这种情况下,某些操作系统库可能可用,但是您在其他处理器(GPU、TPU、DSP、FPGA)上运行内核,那么该库需要在该处理器的机器代码中编译(不仅仅是位数)。

根据特定的处理器,设备程序的大小、单个内核以及变量的数量和大小都会受到限制。

对于大多数情况,这意味着您需要相对较小的库(与桌面 CPU 编程相比),并且您需要希望在内核中使用的库的完整 C 源代码。

(对于一些较新的处理器和 OpenCL 驱动程序,您可能能够在某些限制内使用 C++ 库 - 请阅读您正在使用的版本的文档。)

© www.soinside.com 2019 - 2024. All rights reserved.