我们实际上应该如何包含我们的OpenCL代码?

时间:2016-01-12 16:51:17

标签: opencl

我们如何 假设 将我们的OpenCL代码包含在我们的C项目中?

我们无法假设将我们的.cl文件与可执行文件的可执行文件一起发送给它们并在运行时加载它们,因为那是愚蠢的,正确的?

我们无法假设使用某些stringify宏因为a)显然不可移植/导致未定义的行为b)如果使用逗号则全部失效没有用括号括起来,就像在定义相同类型的许多变量时一样,我在这里花了一个小时寻找解决方案,而且似乎并没有真正起作用的那个,而且c)'有点愚蠢。

我们是否希望将代码编写为"int x, y;\n" "float4 p;\n"等C字符串文字?因为我没有这样做。我们应该做我们的.cl文件的C包含式hexdump吗?这似乎不方便。我们究竟应该做什么?

很糟糕的是,所有这些方法基本上都意味着当您的OpenCL代码可能是您想要开源的最后一件事时,您必须使用您的OpenCL代码本质上是开源的程序,最重要的是它似乎我所见过的每个OpenCL项目都采用了上面列出的方法之一,它看起来并不合适,就像那些让OpenCL忘记某些事情的人一样。

1 个答案:

答案 0 :(得分:4)

这个帖子:OpenCL bytecode running on another card提到了SPIR,一个用于OpenCL设备程序的"平台可移植的中间表示" 。除此之外,你基本上受限于你已经提到的选项。

就个人而言,我开始使用C ++ 11原始字符串文字来摆脱我讨厌的stringify-macros。但是,不知道C ++是否适合您。

关于你拒绝"运送我们的.cl文件以及我们的可执行文件" 方法:我不明白为什么这本身就是愚蠢的 - CL& #34;着色器"是一个应用程序资源,就像可执行文件旁边的所有其他单独文件一样,因此是"应用程序包的一部分"。拥有这样的文件是完全合理的,每个操作系统都有办法处理它(在win32中,程序目录是包https://blogs.msdn.microsoft.com/oldnewthing/20110620-00/?p=10393,OSX有自己的包概念等。 ..)。

现在,如果您担心其他人窥视您的OpenCL代码,您仍然可以应用一些混淆方法(例如,通过在您的可执行文件中或多或少地巧妙隐藏的密钥加密您的.cl文件)。

[编辑/旁注]:我们还可以研究其他公司如何在例如OpenGL / Direct3D着色器的背景下处理这个问题。在我有限的经验中,游戏公司倾向于在他们的应用程序目录中的某个地方以文本形式转储着色器,供所有人查看(甚至篡改)。所以至少在游戏世界中,在这方面并没有太大的秘密......想知道adobe或CAD软件公司在他们的专业软件中做了什么。