我VexCL的開發者,我也回覆了您的問題here。
VexCL爲您在運行時在代碼中使用的表達式生成OpenCL/CUDA內核。而且,它允許用戶將生成的內核源文件轉儲到標準輸出流。例如,如果你可以使用以下的HELLO.CPP文件:
#include <vexcl/vexcl.hpp>
int main() {
vex::Context ctx(vex::Filter::Env);
vex::vector<double> x(ctx, 1024);
vex::vector<double> y(ctx, 1024);
y = 2 * sin(M_PI * x) + 1;
}
然後用
g++ -o hello hello.cpp -std=c++11 -I/path/to/vexcl -lOpenCL -lboost_system
然後設置VEXCL_SHOW_KERNELS = 1編譯和運行編譯的二進制:
$ export VEXCL_SHOW_KERNELS=1
$ ./hello
您將看到爲表達式y = 2 * sin(M_PI * x)+ 1生成的內核:
#if defined(cl_khr_fp64)
# pragma OPENCL EXTENSION cl_khr_fp64: enable
#elif defined(cl_amd_fp64)
# pragma OPENCL EXTENSION cl_amd_fp64: enable
#endif
kernel void vexcl_vector_kernel
(
ulong n,
global double * prm_1,
int prm_2,
double prm_3,
global double * prm_4,
int prm_5
)
{
for(size_t idx = get_global_id(0); idx < n; idx += get_global_size(0))
{
prm_1[idx] = ((prm_2 * sin((prm_3 * prm_4[idx]))) + prm_5);
}
}
VexCL還允許緩存已編譯的二進制源(默認情況下位於$ HOME/.vexcl文件夾中),並將源代碼保存在緩存中。
一方面,您看到的來源是自動生成的,不是非常人性化的。另一方面,這些閱讀比例如反彙編二進制文件更方便閱讀。恐怕沒有辦法讓資源遠離「黑客」,除非可能修改VexCL源代碼以滿足您的需求。 MIT許可證允許你這樣做,如果你準備好這樣做,我可以爲你提供一些指導。
請注意,NVIDIA OpenCL驅動程序是自己的緩存,它還將內核源與高速緩存的二進制文件(位於$ HOME/.nv/ComputeCache文件夾中)一起存儲。我不知道是否有可能改變這種行爲,所以'黑客'仍然可以從那裏獲取內核資源。我不知道AMD是否也做過類似的事情,但可能這就是你的源代碼所說的「用AMD設備登錄內核」。
關於MacOS兼容性,我沒有MacOS機器來做我自己的測試,但我有報道說VexCL在那裏工作。我不確定使用了什麼IDE。
非常感謝這個清晰的答案:) –