MacOS ARM平台下OpenCL中mint类型定义疑似错误问询
关于Mathematica 14.0.0在Mac OS X ARM64上OpenCL mint类型的问题
问题场景
在Mac OS X ARM(64位)14.4.1系统上运行Mathematica 14.0.0时,使用mint类型编写OpenCL内核会出现执行结果错误,替换为long后结果恢复正常。
错误测试脚本
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}}
上述执行结果错误,前5个元素出现异常值,后5个未被正确修改。
修正后测试脚本
将内核中的mint替换为long后,执行结果正确:
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}}
问题解答
1. mint类型定义的头文件位置
mint是Mathematica OpenCLLink中定义的整数类型,其typedef通常位于Mathematica安装目录下的OpenCL相关头文件中,具体路径为:/Applications/Mathematica.app/Contents/SystemFiles/Links/OpenCLLink/Resources/C/include/WolframOpenCL.h
该头文件会自动被OpenCLFunctionLoad加载到OpenCL编译环境中。
2. MacOS ARM64目标的正确类型实现
从测试结果来看,当前环境中mint的typedef存在位数不匹配问题:Mathematica传递的是64位整数(Integer64),但mint被错误解析为32位类型,导致内存访问异常。解决方式有两种:
- 临时修正:在OpenCL内核代码开头手动添加typedef,强制将
mint映射为64位整数:typedef long mint; - 直接替换:如测试中所示,直接使用
long(MacOS ARM64下为64位)代替mint作为内核参数类型,确保与Mathematica传递的Integer64类型匹配。
内容的提问来源于stack exchange,提问作者Olivier Janssens
相关产品推荐
相关产品推荐

