2013-12-20 203 views
0

我想制作一个“将分发给客户”的程序,所以我想保护我的内核代码免受黑客的攻击“有人告诉我,AMD驱动程序一些如何将内核源码放入内部二进制,所以黑客可以登录与AMD设备”使用VexCL“编译二进制文件”

,因为我不VexCL尚未经历过,什么是正确的编译行刚刚发布的二进制文件

例如使用CUDA我可以输入内核:NVCC -gencode arch = compute_10,code = sm_10 myfile.cu -o myexec

什么是VexCL中的equivilent?

VexCL还可以在Mac OS上工作哪个IDE? (这是因为我没有经验,在Mac OS之前,未来的任务)

我以前用的OpenCL的经验是通过使用STDCL库“但它是在Windows上车,不支持Mac”

回答

2

我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。

+0

非常感谢这个清晰的答案:) –

相关问题