当我为一台设备构建程序时,为什么会得到多个 OpenCL“二进制文件”?

我正在构建一个 OpenCL 程序 - 使用 NVIDIA CUDA 11.2 的 OpenCL 库(及其 C++ 绑定)。成功调用 cl::Program::build() 后,对于单个设备(通过单个设备索引传递向量),我使用:built_program.getInfo<CL_PROGRAM_BINARY_SIZES>() 获取生成的“二进制”大小,这也成功,但给了我 3 个值:一个非零值和两个零。当我打印第一个二进制文件时,我看到了我期望的 PTX 代码。

我的问题:为什么给我两个(空)额外的二进制文件?

p7888835 回答:当我为一台设备构建程序时,为什么会得到多个 OpenCL“二进制文件”?

即使程序是为您指定的特定设备构建的(参见 documentation for clBuildProgram),二进制文件也可用于上下文中的每个设备。就您而言,您的系统上可能有三个 GPU;您为单个设备构建了程序,因此对于三个设备之一,您会看到一个非空的 PTX。

令人困惑?当然。纠结?是的。但这完全没有意义吗?诚然,并非如此。

再深入一点,似乎这甚至是正式的documented(强调我的):

返回一个数组,其中包含程序二进制文件的大小(可以是可执行二进制文件、编译二进制文件或库二进制文件)对于与程序关联的每个设备。数组的大小是与程序关联的设备数量。如果二进制文件不可用于设备,则返回大小为零。

不是您构建的每个设备,而是与程序关联的每个设备;这可能是 OpenCL 上下文中用于创建程序的每个设备。

本文链接:https://www.f2er.com/390089.html

大家都在问