M3 Pro芯片Mac下Xcode运行C语言OpenMPI项目编译成功但运行异常的问题排查
兄弟,我来帮你捋捋这个问题!先给你吃个定心丸:你的程序其实已经正常运行并成功退出了(最后一行Program ended with exit code: 0就是实锤),那些看起来吓人的报错信息都是OpenMPI在M系列Mac上的兼容小插曲,不是你的代码或者项目配置出了致命问题。不过咱可以把这些烦人的提示消掉,让运行更清爽,下面给你一步步拆解:
先搞懂那些报错到底是啥
MetalTools框架警告
那个NSBundle file:///System/Library/PrivateFrameworks/MetalTools.framework/ principal class is nil的警告,和OpenMPI半毛钱关系都没有——这是Apple Silicon Mac系统自带的Metal框架在加载时的小bug,完全不影响你的MPI程序运行,只是看着闹心。共享内存段创建提示
那个shmem: mmap: an error occurred while determining whether or not ... sm_segment... could be created的错误,是OpenMPI在M系列Mac上的共享内存配置和系统沙箱机制的小冲突。OpenMPI默认的共享内存创建路径碰到了系统临时目录的权限限制,但因为是“检查时的错误”,不影响单进程运行(你看进程0的输出正常打出来了),但如果要跑多进程可能会出问题。
具体解决步骤(针对Xcode场景)
咱直接在Xcode里调整运行配置就行,不用改代码:
- 打开项目后,点击顶部菜单栏的项目名称(或者用快捷键
Cmd+<),打开Edit Scheme(编辑方案) - 切换到
Run->Arguments标签页:- 抑制Metal框架警告:在
Environment Variables里点+,添加变量DYLD_PRINT_FRAMEWORK_WARNINGS,值设为NO - 修复共享内存问题:再添加一个变量
OMPI_MCA_shmem_mmap_priority,值设为tmpfs——让OpenMPI用tmpfs来创建共享内存段,绕开系统临时目录的权限坑 - (可选)如果想测试多进程,在
Arguments Passed On Launch里加上-np 4(比如4个进程,数字你可以随便改),不然默认只会跑1个进程
- 抑制Metal框架警告:在
最后说句掏心窝子的
其实你现在的代码和编译配置都是对的,那些报错都是“非致命”的,不影响功能,但调整完之后运行日志就干净多了,多进程运行也不会出问题。
备注:内容来源于stack exchange,提问作者FueledByPizza

