使用Eigen和Eigen_在iOS项目中使用_BLAS

使用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。为了加速数学运算,我加入了宏
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库的情况下。启用优化后,您肯定不会有那么大的差异。