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

穆罕默德·萨克(Mohamed Sakr)

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

杰米多夫

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用go动态创建编译的二进制文件

来自分类Dev

g ++编译的二进制文件给出“无法执行二进制文件”

来自分类Dev

编译二进制

来自分类Dev

是否可以优化已编译的二进制文件?

来自分类Dev

从编译的二进制文件中获取golang版本

来自分类Dev

编译的Elf二进制文件太大

来自分类Dev

在Eclipse SIGSEV中编译C二进制文件

来自分类Dev

显示从哪个git commit编译二进制文件

来自分类Dev

无法执行刚刚编译的二进制文件

来自分类Dev

编译的Elf二进制文件太大

来自分类Dev

无法执行刚刚编译的二进制文件

来自分类Dev

编译后更改二进制文件目录

来自分类Dev

将编译时间信息嵌入二进制文件

来自分类Dev

如何卸载自编译二进制文件?

来自分类Dev

VS 编译的二进制文件中的符号

来自分类Dev

在GHC编译的二进制文件中过多使用神秘的系统时间

来自分类Dev

混合使用不同编译器版本构建的二进制文件

来自分类Dev

为什么默认情况下不使用gcc编译二进制文件

来自分类Dev

使用gcc编译PowerPC二进制文件并限制可用的寄存器

来自分类Dev

如何在Linux上的C库中使用已编译的二进制文件?

来自分类Dev

如何检查使用哪个编译器生成二进制文件

来自分类Dev

为什么默认情况下不使用gcc编译二进制文件

来自分类Dev

指定给Xcode使用哪些二进制文件进行编译

来自分类Dev

使用Ansible编译和安装简单的二进制文件

来自分类Dev

使用相同编译器标志的不同 Makefile 会生成不同的二进制文件

来自分类Dev

二进制文件如何“二进制”?

来自分类Dev

UNIX:交叉编译使用共享对象文件的二进制文件后,找不到文件或目录

来自分类Dev

如何使用gdb调试原始二进制文件

来自分类Dev

不要使用GoClipse制作二进制文件

Related 相关文章

  1. 1

    使用go动态创建编译的二进制文件

  2. 2

    g ++编译的二进制文件给出“无法执行二进制文件”

  3. 3

    编译二进制

  4. 4

    是否可以优化已编译的二进制文件?

  5. 5

    从编译的二进制文件中获取golang版本

  6. 6

    编译的Elf二进制文件太大

  7. 7

    在Eclipse SIGSEV中编译C二进制文件

  8. 8

    显示从哪个git commit编译二进制文件

  9. 9

    无法执行刚刚编译的二进制文件

  10. 10

    编译的Elf二进制文件太大

  11. 11

    无法执行刚刚编译的二进制文件

  12. 12

    编译后更改二进制文件目录

  13. 13

    将编译时间信息嵌入二进制文件

  14. 14

    如何卸载自编译二进制文件?

  15. 15

    VS 编译的二进制文件中的符号

  16. 16

    在GHC编译的二进制文件中过多使用神秘的系统时间

  17. 17

    混合使用不同编译器版本构建的二进制文件

  18. 18

    为什么默认情况下不使用gcc编译二进制文件

  19. 19

    使用gcc编译PowerPC二进制文件并限制可用的寄存器

  20. 20

    如何在Linux上的C库中使用已编译的二进制文件?

  21. 21

    如何检查使用哪个编译器生成二进制文件

  22. 22

    为什么默认情况下不使用gcc编译二进制文件

  23. 23

    指定给Xcode使用哪些二进制文件进行编译

  24. 24

    使用Ansible编译和安装简单的二进制文件

  25. 25

    使用相同编译器标志的不同 Makefile 会生成不同的二进制文件

  26. 26

    二进制文件如何“二进制”?

  27. 27

    UNIX:交叉编译使用共享对象文件的二进制文件后,找不到文件或目录

  28. 28

    如何使用gdb调试原始二进制文件

  29. 29

    不要使用GoClipse制作二进制文件

热门标签

归档