我写了这个小的子例程,该子例程比较了简单的矢量数学函数,并以循环执行:

f(i) = a(i) + b(i)

或直接:

f = a + b

或使用Intel MKL VML:

vdadd(n,a,b,f)

N = 50000000的定时结果是:

VML 0.9秒直接0.4循环0.4

而且我不明白,为什么VML需要其他方法的两倍! (有时循环比直接更快)

可以在下面找到子例程 http://paste.ideaslabs.com/show/l6dvldaoif并打电话给Via

program test

  use vmltests
  implicit none

  call vmlTest()

end program
有帮助吗?

解决方案

您的示例代码有潜在的L2缓存问题,可以通过阻止优化来克服它。有关详细信息,请参见英特尔®软件网络论坛答案: http://software.intel.com/en-us/forums/showthread.php?t=80041

英特尔®优化通知:

英特尔®编译器,关联的库和相关开发工具可能包括或利用选项,以优化为Intel®和非Intel微处理器可用的指令集(例如,SIMD指令集),但不要为非智能微处理器进行平等优化。此外,英特尔微处理器保留了英特尔编译器的某些编译器选项,包括某些不具体的Intel Micro架构。有关Intel编译器选项的详细说明,包括他们所涉及的指令集和特定的微处理器,请参阅“编译器选项”下的“Intel®编译器用户和参考指南”。与其他微处理器相比,针对英特尔微处理器的优化更高。虽然Intel®编译器产品中的编译器和库为Intel和Intel兼容的微处理器提供了优化,但根据您选择的选项,代码和其他因素,您可能会获得额外的选择在英特尔微处理器上的性能。

英特尔®编译器,相关的库和相关的开发工具可能会或可能不会在非智能微处理器中优化相同的程度,以实现英特尔微处理器并非唯一的优化。这些优化包括Intel®流SIMD扩展2(Intel®SSE2),Intel®流SIMD Extensions 3(Intel®SSE3)和补充流SIMD Extensions 3(Intel®SSSE3)指令集和其他优化。英特尔不能保证对未由英特尔制造的微处理器的任何优化的可用性,功能或有效性。该产品中的微处理器依赖性优化旨在与英特尔微处理器一起使用。

尽管英特尔认为我们的编译器和图书馆是有助于获得Intel®和非Intel微处理器上最佳性能的绝佳选择,但英特尔建议您评估其他编译器和图书馆,以确定哪些最佳满足您的要求。我们希望通过努力提供任何编译器或图书馆的最佳性能来赢得您的业务;如果您发现我们没有,请告诉我们

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top