2017-09-26 384 views
0

我編程OpenCL通過在Ubuntu 16.04.3 64位上的pyopenCL,在Nvidia的Tesla K10.G2.8GB上的 。包括標頭OpenCL(32位和64位)

到目前爲止,只要我沒有在我的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

baiscally提示噸o安裝libc6-dev-i386gcc-multilibg++-multilib,假設潛在問題是64位/ 32位問題。我的問題是,我的GPU的OpenCL二進制文件是否編譯爲32位二進制文​​件(如何檢查?)?

如果是:

還有沒有其他的注意事項,當我想編譯一個64位操作系統的32位二進制文​​件?

此外:當我的內核編譯爲32位時,我可以使用64位浮點數嗎? (例如,將#pragma OPENCL EXTENSION cl_khr_fp64 : enable還是工作?)

如果沒有:

我必須手動定位/複製所有必要的頭文件,並用手包括他們?

另外:我的一些同事甚至懷疑,這其中包括標準的C頭到OpenCL內核可能是由於缺少連接體。任何燈光也讚賞。

+0

我不知道,但我認爲OpenCL可能只是語言https://www.khronos.org/files/opencl-1-2-quick-reference-card。pdf和相關資源:https://www.khronos.org/opencl/resources。在我對PyOpenCL非常有限的知識中,我沒有在內核中編寫或者看到過'#include _any_library_'。 – benshope

+0

在SO上快速搜索'include header openCL',可以發現至少有些人將自己的頭文件包含在OpenCL內核代碼中。我正在談論用OpenCL C編寫的內核代碼(基本上是C的子集) – Dschoni

+0

哦,是的,我想是的。剛剛看到這一個:https://stackoverflow.com/questions/14502925/include-headers-to-opencl-cl-file我會讓更多的人瞭解PyOpenCL回答你的問題... – benshope

回答

2

標準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代碼 頭和#包括它轉化爲OpenCL C程序。這工作正常:

// foo.h 
void foo() { 
    printf("hello world!"); 
} 

// kernel.cl 
#include "foo.h" 
__kernel void use_foo() { 
    foo(); 
}