0

我正在尝试在运行 Mac OSX 10.6.6 和 Xcode 3.2.6 的 64 位 Mac 上使用 Intel Math Kernel Library (MKL)。对于 Mac,英特尔 MKL 只能通过安装完整的英特尔 Composer XE 2011 C++ 编译器来使用。我已经这样做了,我运行了 bash 脚本

/Developer/opt/intel/composer_xe_2011_sp1.6.038/mkl/bin/intel64/mklvars_intel64.sh
/Developer/opt/intel/composer_xe_2011_sp1.6.038/link_install.sh

为 Composer XE 和 MKL 设置环境变量。我能够使用编译器在 Xcode 中构建简单的测试项目。

但是,我无法使用 MKL,因为我无法将其链接到 Xcode中,如此处所述。我没有该超链接中描述的 MKL 框架文件夹

/Library/Frameworks/Intel_MKL.framework/

(具体来说,我的系统上的任何地方都没有标题为 Intel_MKL.framework 的文件夹。)英特尔的几本 MKL 参考手册中提到了检查以确保该文件夹存在,但他们没有告诉你如果不存在该怎么做'不存在!如果您已正确安装 MKL,似乎假定它存在,但我有(“Composer XE 安装成功”)并且没有 Intel_MKL.framework。

如果重要的话,我得到的错误是

"_dsyevx", referenced from:
jEigenvalues(TNT::Array2D<double>&, TNT::Array1D<double>&)in main.o 
ld: symbol(s) not found
collect2: ld returned 1 exit status

我理解这与没有正确链接是一致的。

我花了很多时间和精力试图获得帮助,包括英特尔论坛,但无济于事。我怀疑这是一个简单的问题(我只是一个业余爱好者)。

非常感谢您的帮助。


编辑:

在 Paul 的建议下,我重新运行了安装程序,没有任何变化。唯一的 mkl.h 文件位于

/Developer/opt/intel/composer_xe_2011_sp1.6.038/mkl/include 

以及非 Xcode 安装目录中预期的相同副本

/opt/intel/composer_xe_2011_sp1.6.038/mkl/include

我不知道这是否是我应该在 Xcode 的“标题搜索路径”下列出的内容,但我很久以前就列出了它。我也列出了

/Developer/opt/intel/composer_xe_2011_sp1.6.038/mkl/lib 

作为“库搜索路径”,我根据阅读此2011 指南的最佳尝试添加了这些链接器标志:

-libmkl_intel_lp64.a 
-libmkl_core.a 
-libmkl_sequential.a 
-libmkl_intel_thread.a

什么都没有改变,我得到同样的错误:

ld returned 1 exit status

他的问题可能出在动态与静态链接上吗?我选择了静态链接(.a 结尾而不是 .dylib),因为它看起来更简单,但我不知道。更改为动态并没有做任何事情。

反正有反馈,在这里?我不知道根据这个错误要改变什么。


编辑2:

我刚刚在 Xcode“项目信息”(可能是 100 个选项之一)中找到了一个我不知道存在的选项“使用英特尔数学内核库”。(我应该在哪里找到这个?)现在事情正在建设中,但是当我运行可执行文件时,我得到了

exit;
dyld: Library not loaded: libmkl_intel_lp64.dylib
  Referenced from: /Users/.../nameofexecutable
  Reason: image not found
Trace/BPT trap
logout

我已经仔细检查了库搜索目录是否正确。我还尝试切换以 .a 结尾的静态库,但错误完全相同。(仍然有 .dylib 结尾。)这是否意味着我被动态困住了?为什么?我还定义了变量

DYLD_LIBRARY_PATH

成为

/Developer/opt/intel/composer_xe_2011_sp1.6.038/compiler/lib: /Developer/opt/intel/composer_xe_2011_sp1.6.038/mkl/lib

正如此处旧说明中所建议的那样,但没有任何改变。

哇,这太难了。

4

2 回答 2

1

对于 OS X 10.6.8 上的 ICC 11.1,MKL 框架在这里:

/opt/intel/Compiler/11.1/058/Frameworks/mkl

假设这是一个较新的版本(ICC 12?),如果英特尔已移动它,您可能只需要稍微挖掘一下即可找到相关目录。

(请注意,您链接到的英特尔文章来自 2009 年 6 月,与 ICC 11.0 相关。)

于 2011-10-18T15:33:22.847 回答
1

重要编辑

至少在我“从 XCODE”运行可执行文件时,在此编辑下写的内容有效。当我找到它内置的目录并在那里双击它时,我收到以下消息:

Last login: Sun Nov 24 17:05:19 on ttys002
MacBook-Pro-de-totouser:~ totouser$ /Users/totouser/Library/Developer/Xcode/DerivedData/THECONSOLEAPPLICATION-hknajgycvjjcotdtkeeyxbzmtfty/Build/Products/Debug/THECONSOLEAPPLICATION ; exit;
dyld: Library not loaded: libmkl_sequential.dylib
  Referenced from: /Users/totouser/Library/Developer/Xcode/DerivedData/THECONSOLEAPPLICATION-hknajgycvjjcotdtkeeyxbzmtfty/Build/Products/Debug/THECONSOLEAPPLICATION
  Reason: image not found
Trace/BPT trap: 5
logout

[处理完成]

如果有人可以提供帮助,那就太好了,因为我真的被困在这里

///////////////////////////////////////// ///////////////////////////////////////// /////////////////////////

好的,我成功地做了你想做的事:

我已经在我使用 XCode 5.0.2 的 mac os 10.8.5 64bits 下安装了 m_ccompxe_2013_sp1.1.103。

首先是在项目中引用 mkl 的包含目录。在这样做之前,我想强调的是,即使在完成之后,我也永远无法在 c++ 代码中编写这样的东西

#include "mkl.h"

而且我不得不将完整路径放入 mkl.h 文件,这有点无聊,因为我希望理想地这样放置:

#include <mkl>
#include <mkl_vsl.h>
#include <mkl_vsl_functions.h>

所以我在我的mac上找到了“iostream”文件,将它复制到某个地方,将副本的名称修改为mkl,并将mkl.h的内容(位于“/opt/intel/composer_xe_2013_sp1.1.103/mkl /include”在我的mac上),将其保存在“/opt/intel/composer_xe_2013_sp1.1.103/mkl/include”中,我在include中引用了目录“/opt/intel/composer_xe_2013_sp1.1.103/mkl/include”我的 xcode 项目的目录。我是怎么做到的?

我双击“目标”,然后单击“构建设置”,然后单击“全部”,然后搜索“搜索路径”菜单。那里

1)在“头文件搜索路径”中,调试和发布,我把“/opt/intel/composer_xe_2013_sp1.1.103/mkl/include”和“/opt/intel/composer_xe_2013_sp1.1.103/mkl/include/intel64”

2)在“库搜索路径”中,调试和发布我把“/opt/intel/composer_xe_2013_sp1.1.103/compiler/lib/intel64”和“/opt/intel/composer_xe_2013_sp1.1.103/compiler/lib”和“/opt/英特尔/composer_xe_2013_sp1.1.103/mkl/lib"

然后我编辑了“DYLD_LIBRARY_PATH”环境变量(仅在我的项目中),使其等于“/opt/intel/composer_xe_2013_sp1.1.103/compiler/lib:/opt/intel/composer_xe_2013_sp1.1.103/compiler/lib/intel64:/opt /intel/composer_xe_2013_sp1.1.103/mkl/lib”。我是怎么做到的?我在上栏左侧的三角形和方形按钮旁边单击我的项目图标的名称,然后单击打开一个窗口的“编辑方案”,然后单击“运行我的项目调试”在该窗口的左栏中,然后我单击“参数”,进入“环境变量”,然后 +'da 新变量名为 DYLD_LIBRARY_PATH 的值

/opt/intel/composer_xe_2013_sp1.1.103/compiler/lib:/opt/intel/composer_xe_2013_sp1.1.103/compiler/lib/intel64:/opt/intel/composer_xe_2013_sp1.1.103/mkl/lib

奇怪的是,这也设置为“运行我的项目发布”,这对我来说没问题,但我仍然觉得这很奇怪。反正。

在此之后,我必须添加命令告诉编译器(LLVM 5,没有修改与此相关的任何内容)以链接到我将要使用的库:

为此,我双击“目标”,然后进入“构建设置”,然后进入“全部”,然后在调试和发布中搜索“其他链接器标志”:

-lmkl_sequential -lmkl_core -lmkl_intel_lp64 -lpthread -lmkl_intel_thread -liomp5

然后在 main.cpp 我放了例如:

#include <iostream>
// #include "/opt/intel/composer_xe_2013_sp1.1.103/mkl/include/mkl.h"
// #include "/opt/intel/composer_xe_2013_sp1.1.103/mkl/include/mkl_vsl.h"
// #include "/opt/intel/composer_xe_2013_sp1.1.103/mkl/include/mkl_vsl_functions.h"
#include <mkl>
#include <mkl_vsl.h>
#include <mkl_vsl_functions.h>

int main(int argc, const char * argv[])
{
    VSLStreamStatePtr stream;
    vslNewStream(&stream, VSL_BRNG_SFMT19937, 777);
    double * pUNIF = new double [ 1000000 ] ;
    vdRngUniform(VSL_RNG_METHOD_UNIFORM_STD_ACCURATE, stream, 1000000, pUNIF, 0.0, 1.0);
    vslDeleteStream(&stream);
    for (int i = 0 ; i < 100000 ; ++i )
    {
        std::cout << *(pUNIF+i) << std::endl;
    }
    std::cout << "END." << std::endl;
    getchar();
    return 0;
}

然后我构建并运行,我一切都很好;-)

正如亲爱的马尔科姆·塔克爵士所说:“永远不容易,永远不会容易。”

问候,

MEF。

于 2013-11-24T14:38:22.677 回答