我想制作一个程序“将分发给客户”,所以我想保护我的内核代码不受黑客的攻击。 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支持”
最佳答案
我是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。