使用VexCL“编译二进制文件”

时间:2013-12-20 15:54:03

标签: c++ vexcl

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

因为我对VexCL没有经验,只需分发二进制文件的正确编译行是什么

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

VexCL中的等值是什么?

VexCL也适用于Mac OS?哪个IDE? (这是未来的任务,因为我之前没有Mac OS的经验)

我之前使用OpenCL的经验是使用STDCL库“但它在Windows上有问题,没有Mac支持”

1 个答案:

答案 0 :(得分: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。