Parsing OpenCL:帮助解析JIT编译的cl代码 我有一点.CL代码,我用OpenCL C++ API编译。对于我在网上发现的以下代码(用于生成随机数),我不断收到JIT编译错误。 CL语言中的函数定义为: uint2 MWC_SkipImpl_Mod64(uint2 curr, ulong A, ulong M, ulong distance) { ulong m=MWC_PowMod64(A, distance, M); ulong x=curr.x*(ulong)A+curr.y; x=MWC_MulMod64(x, m, M); return (uint2)((uint)(x/A), (uint)(x%A)); }

Parsing OpenCL:帮助解析JIT编译的cl代码 我有一点.CL代码,我用OpenCL C++ API编译。对于我在网上发现的以下代码(用于生成随机数),我不断收到JIT编译错误。 CL语言中的函数定义为: uint2 MWC_SkipImpl_Mod64(uint2 curr, ulong A, ulong M, ulong distance) { ulong m=MWC_PowMod64(A, distance, M); ulong x=curr.x*(ulong)A+curr.y; x=MWC_MulMod64(x, m, M); return (uint2)((uint)(x/A), (uint)(x%A)); },parsing,opencl,jit,Parsing,Opencl,Jit,LLVM给我的错误是: <program source>:128:2: error: conflicting types for 'MWC_SkipImpl_Mod64' <program source>:54:7: note: previous definition is here uint2 MWC_SkipImpl_Mod64(uint2 curr, ulong A, ulong M, ulong distance) ^ <program sour

LLVM给我的错误是:

<program source>:128:2: error: conflicting types for 'MWC_SkipImpl_Mod64'
<program source>:54:7: note: previous definition is here
uint2 MWC_SkipImpl_Mod64(uint2 curr, ulong A, ulong M, ulong distance)
      ^
<program source>:133:12: error: returning '__uint2' from a function with incompatible result type 'int'
    return (uint2)((uint)(x/A), (uint)(x%A));
出于某种原因,它不喜欢
(uint2)((uint)(x/A),(uint)(x%A))
,并认为我试图将一个int强制返回到一个无符号的int 2中。我知道在解析过程中,生成的源代码行以转义字符“\”结尾

这可能是我下面出现错误的原因吗?更重要的是,我如何克服它,在扫描源代码的过程中,我应该过滤什么类型的特殊字符

谢谢,
Amine

您将
.cl
文件读入字符串的方式似乎是问题所在。可能是每行末尾的转义字符。尝试使用以下命令读取文件:

#包括
#包括//读/写文件
string read_file(const string path){//将filepath作为输入,将文件内容作为字符串返回
ifstream文件(路径,ios::in);
常量字符串r((istreambuf_迭代器(文件)),istreambuf_迭代器();
file.close();
返回r;
}

我终于找到了上面没有编译的原因:JIT编译器没有看到任何要编译的内核函数,并向我抛出了一个错误-11

案件结案


谢谢,

OpenCL代码看起来不错。是否有第二个名为
MWC\u SkipImpl\u Mod64
但返回类型不同的函数?如何在C++中嵌入OpenCL代码(原始字符串/字符串化/读取从单独的<代码> Cl<?/Cl>文件)?我严格化.CL文件的内容:MWCKSKIPPyMyMod 64的定义是在一个文件中,我先将其细化,然后将其余的源代码附加到该字符串中。此函数没有其他定义。如果您知道任何其他在Xcode中“解析”代码的方法可以防止这种字符解析的噩梦,我将不胜感激。感谢您,我将首先考虑解决“MWC\u SkipImpl\u Mod64”的冲突类型。您可能需要在使用函数原型之前声明它吗?或者您这样做了,但是原型声明(第54行)不匹配吗?我使用您的函数读取文件,但还有另一个问题:我得到的代码在某些函数(//…)上方有一些注释行。llvm中的cl编译器是否理解它需要忽略它们——就像任何其他语言一样?如果不是,那么我怀疑这也可能会使JIT编译器崩溃。谢谢,cl编译器理解注释的//语法并忽略它们。它毕竟是C99的衍生物。您还可以在OpenCL代码中执行#ifdef预处理器块或#定义宏/常量。我在定义的内核前面缺少关键字kernel,因此显然没有什么可编译的!我导入了其他人的代码,忘记了他没有定义任何“内核”。我的错!
uint2 tmp = MWC_SkipImpl_Mod64((uint2)(s->x,s->c), (ulong)(MWC64X_A), (ulong)(MWC64X_M), distance);