没有外部内核文件的openCL
openCL without external kernel file
我想创建一个OpenCL内核,而不给最终用户访问它。
因此,我不能使用常规的外部.cl
文本文件。有什么替代方案,关于我想避免创建一个巨大的文本字符串与内核?
还有一个问题,如果我把这段代码放在一个硬编码的字符串中,难道不可能从一些反汇编器中访问这段代码吗?
这里有两种情况:
- 如果您的目标是单个设备
- 如果您的目标是任何OpenCL设备
在第一个场景中,有可能将二进制数据嵌入到可执行文件中(使用字符串)。并在运行程序时加载它。逆向工程是不可能的(除非是已知的,比如汇编),因为程序将编译代码,而不是您编写的原始代码。
这样做的方法是:
uchar binary_dev1[binarySize] = "..."
uchar * binary = &binary_dev1;
program = clCreateProgramWithBinary(context, 1, &device,
&binarySize,
(const unsigned char**)&binary,
&binaryStatus,
&errNum);
第二种选择涉及通过某种"mangling"来保护内核中的源代码。由于mangler代码将被编译,因此逆向工程可能会很复杂。
你可以做任何你能想到的可逆的变形,甚至把它们组合起来。一些想法:
使用压缩格式压缩代码,但硬编码解压缩的一些参数,使其不那么简单。
LZ4, ZLIB等
对代码使用异或操作符。如果它随时间变化更好,如果它使用一个不明显的规则变化更好。
- 例如:
char seq = 0x1A; for(int i=0; i<len; i++){ out[i] = in[i] ^ seq; seq = ((seq ^ i) * 78965213) >> 4 + ((seq * i) * 56987) << 4; }
使用需要密钥的编码方法进行编码,并且是可逆的
为OpenCL 1.2使用SPIR 1.2或为OpenCL 2.0使用SPIR 2.0,直到OpenCL 2.1的SPIR- v可用。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- CMake OpenCL:无法读取内核文件
- 英特尔 OpenCL SDK - 头文件在哪里
- AMD OpenCL 致命错误:CL/cl.hpp:没有这样的文件或目录
- 使用OpenCL 2.0 c++绑定头文件的链接器错误
- c++中包含相对路径的OpenCL头文件问题
- Opencl内核文件没有完全加载
- 没有外部内核文件的openCL
- 使用nvcc的可执行程序比使用gcc/g++和OpenCL的可执行文件大
- 编译 OpenCL 文件时LNK2019许多错误
- 包括 OpenCL .cl 文件的标头
- 如何将OpenCL内核文件(.cl)编译为llvm IR文件
- 如果从二进制文件加载,OpenCL将导致CL_INVALID_COMMAND_QUEUE