使用Eigen和Eigen_在iOS项目中使用_BLAS
出于教育目的,我尝试在我的宠物项目中使用Eigen。为了加速数学运算,我加入了宏使用Eigen和Eigen_在iOS项目中使用_BLAS,ios,eigen,blas,accelerate-framework,Ios,Eigen,Blas,Accelerate Framework,出于教育目的,我尝试在我的宠物项目中使用Eigen。为了加速数学运算,我加入了宏EIGEN\u USE\u BLAS,它激活了BLAS库的使用 但是当我试图将我的项目上传到Testflight时遇到了一个问题。苹果对此的回应是: ITMS-90338:非公共API使用-应用程序引用非公共API 我的项目中的符号:_saxpy_uu,_sgemm_u,_sgemv_u,_strmm_uu, _strmv_。如果源代码中的方法名称与私有的Apple 在上面列出的API中,更改方法名称将有助于防止这种
EIGEN\u USE\u BLAS
,它激活了BLAS
库的使用
但是当我试图将我的项目上传到Testflight时遇到了一个问题。苹果对此的回应是:
ITMS-90338:非公共API使用-应用程序引用非公共API
我的项目中的符号:_saxpy_uu,_sgemm_u,_sgemv_u,_strmm_uu,
_strmv_。如果源代码中的方法名称与私有的Apple
在上面列出的API中,更改方法名称将有助于防止这种情况
应用程序将不会在以后的提交中被标记。此外,请注意
上述一个或多个API可能位于
已包含在您的应用程序中。如果是这样,则必须将其移除。进一步
有关详细信息,请访问技术支持信息,网址为
我知道苹果有blas
库作为Accelerate.framework
的一部分,它应该通过Accelerate API严格使用。但问题是,Eigen在其源代码中也包含了自己的blas
,而该库实际上并不打算使用Accelerate.framework
私有guts。这就是为什么苹果要求我重新命名这些功能或完全删除它们,以消除这种不便
但我甚至不确定是否有可能——调整Eigen
及其blas
以使用其他名称
有没有办法以某种有效的方式解决这个问题?或者也许我对iOS环境中的Eigen使用情况一无所知?我很幸运地从同事那里得到了一些提示,并且有强烈的意愿完成这项工作,现在我想与大家分享我的结论 问题:Eigen没有提供
BLAS
二进制文件,它只有头文件。当一个人使用EIGEN\u USE\u BLAS
宏并且它实际工作时,这意味着苹果正在将EIGEN BLAS函数链接到他们的二进制文件-BLAS
二进制文件,这是Accelerate.framework
的一部分。最棘手的部分是,您的项目不一定应该包含Accelerate.framework
。XCode将自动添加必要的文件,当然它不会告诉您这些
最让我感到奇怪的是,使用苹果公司的Accelerate.framework提供的“裸”BLAS是一种明显的违规行为,因为它是私有API。所以从我的角度来看,它有点像是XCode违反了这条规则,而不是我的本意,并且对我一无所知。奇怪
因此,为了修复它,您需要构建BLAS
或OpenBLAS
二进制文件(我已经构建了OpenBLAS
),将其添加到项目中,并通过构建设置中的其他链接器标志链接。之后,错误消失,您可以将构建上传到Testflight
为了节省您为iOS
构建OpenBLAS
的时间,我将给您留下一些链接。我认为这些就足够了:
-关于如何构建OpenBLAS
-库的源代码
-讨论您可能遇到的问题的解决方案
我发现整个故事中最令人困惑的部分是来自苹果的信息。这是另一份:
ITMS-90338:非公共API使用-应用程序引用非公共API
我的项目中的符号:saxpy、sgemm、sgemv、strmm、strmv。如果
源代码中的方法名称与列出的私有Apple API匹配
如上所述,更改方法名称将有助于阻止此应用程序
在以后的提交中被标记。此外,请注意,一个或多个
上述API中的更多API可能位于已发布的静态库中
包括在你的应用程序中。如果是这样,则必须将其移除。进一步
有关详细信息,请访问技术支持信息,网址为
我不是以英语为母语的人,但我很有信心地说,这篇文章毫无意义,与解决实际问题毫无关系
它完全没有提到私有API链接到我的代码这一事实,这就是问题所在。我需要为这些函数提供自己的后端,以便使错误消失。它说的是名字匹配,修改我的名字将有助于解决这个问题,而我的情况显然不是这样
我希望苹果能更清楚地说明这个问题,错误描述在将来会更有意义。您有来自工具链的x86编译器或arm编译器吗?您好,谢谢您的回复!你能详细说明一下你的意思吗?如果你使用OpenBLAS而不是使用Egen而不使用-DEIGEN\u USE\u BLAS
(但是使用-O2-march=native-DNDEBUG
编译)的话,你是否真的更快了?并且你可以使用Egen(使用make BLAS
)构建BLAS库。当然,与直接使用Egen相比,将其用作BLAS后端并没有什么好处。事实上,我做了一个基准测试。使用EUGEN\u USE\u BLAS
macro-Eigen时,速度快了30倍。在某些操作中,它甚至快了80倍(在iPad Pro上,一次繁重的计算耗时33毫秒,而EIGEN\u USE\u BLAS
大约为0.4毫秒)。在我的项目中,通过我的计算,EIGEN\u USE\u BLAS
非常重要。我没有编译EIGEN,而是按原样使用它。你认为我应该把它编入图书馆吗?这样做有什么好处?正如我所说的,如果您只想将其用作Eigen的后端,就不需要编译eigenblas库。但您必须在编译时启用优化,特别是在不使用外部BLAS库的情况下。启用优化后,您肯定不会有那么大的差异。