0

我想制作一个“将分发给客户”的程序,所以我想保护我的内核代码免受黑客攻击“有人告诉我 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”

4

1 回答 1

2

我是 VexCL 的开发者,我也在这里回复了你的问题。

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。

于 2013-12-20T19:18:33.487 回答