考虑以下在 Mac OS X ARM(64 位)14.4.1 (23E224) 上使用 Mathematica 14.0.0 运行的小脚本
In[155]:= src = "
__kernel void addTwo(__global mint* arry, mint len) {
int index = get_global_id(0);
if (index >= len) return;
arry[index] += 2;
}";
In[156]:= addTwo =
OpenCLFunctionLoad[src, "addTwo", {{_Integer}, _Integer}, 16]
Out[156]= OpenCLFunction["<>", "addTwo", {{_Integer}, "Integer64"}]
In[157]:= addTwo[ ConstantArray[1, 10], 10]
Out[157]= {{8589934595, 8589934595, 8589934595, 8589934595,
8589934595, 1, 1, 1, 1, 1}}
结果错误!
用 long 替换 mint 给出了正确的结果,如下面的条中所示
In[158]:= src = "
__kernel void addTwobis(__global long* arry, mint len) {
int index = get_global_id(0);
if (index >= len) return;
arry[index] += 2;
}";
In[161]:= addTwobis =
OpenCLFunctionLoad[src, "addTwobis", {{_Integer}, _Integer}, 16]
Out[161]= OpenCLFunction["<>", "addTwobis", {{_Integer}, "Integer64"}]
In[162]:= addTwobis[ ConstantArray[1, 10], 10]
Out[162]= {{3, 3, 3, 3, 3, 3, 3, 3, 3, 3}}
我相信 mint 的 #typedef 指令对于这个特定的机器目标是不正确的。任何人都知道 (.h 文件 ...) mint 类型在哪里定义以及如何实现正确的类型 fpr MacOs 目标。
您需要将 OpenCL 内核中自定义数据类型名称的任何
typedef
放入 OpenCL C 代码本身中:
In[155]:= src = "
typedef int mint;
__kernel void addTwo(__global mint* arry, mint len) {
int index = get_global_id(0);
if (index >= len) return;
arry[index] += 2;
}";