使用OpenMP意外结果的I7和Xeon

并行两个嵌套的for循环,我所遇到的行为,我无法解释。 我曾尝试三种不同的使用OpenMP并行化上I7 860,并和一个至强E5540和我预期的代码行为或多或少在两个平台上是相同的,这意味着一个平台应该快了三种不同的情况下,我测试。 但事实并非如此:

  • 对于案例1,至强是快了约10%,
  • 对于案例2,i7的是更快因子2和
  • 对于情况3,至强又比较快的因素1,5

你有一个想法,这是什么原因?

请说明你需要更多的信息或澄清!

为了进一步澄清,我的问题是指比较一般。 如果我运行在i7处理器和至强系统相同的代码,不应该在可比的(比例)结果使用OpenMP的结果呢?

伪代码:

for 1:4 for 1:1000 vector_multiplication end end

案件:

案例1:没有pramga OMP没有parallelzation

案例2:编译OMP的第一for循环

案例3:编译OMP第二个for循环

结果

下面是从实际数字time命令:

情况1

Time Xeon i7 real 11m14.120s 12m53.679s user 11m14.030s 12m46.220s sys 0m0.080s 0m0.176s

案例2

Time Xeon i7 real 8m57.144s 4m37.859s user 71m10.530s 29m07.797s sys 0m0.300s 0m00.128s

案例3

Time Xeon i7 real 2m00.234s 3m35.866s user 11m52.870s 22m10.799s sys 0m00.170s 0m00.136s

[更新]

感谢所有的提示。 我仍然在研究什么样的原因可能是。

--------------解决方案-------------

这里有一直很好回答有关与编译效应等,这是完全正确的可能变化; 但也有其他原因,预期的差异。 一个相当简单的(如低运算强度)计算这样的往往是内存带宽非常敏感; 并提供每线程内存带宽的数量将取决于你运行多少个线程。 记忆是建立在两个系统上以同样的方式?

它看起来像睿i7 860拥有更高的主频,而E5540拥有更高的总内存带宽。 由于案件2只能使用4个线程,而案件3可以利用更多的,它不是在所有疯狂地认为,在4线程的情况下,时钟速度胜,但在8线程的情况下,增加的内存争( 8线程试图拉/手推出的值)的技巧,以更高bandwdith至强。

制作这种潜在的更复杂的是,它看起来像你正在运行8个线程的事实 - 这些都是双插槽系统,或者你使用超线程? 这使得情况更加复杂,因为超线程实际上有助于在线程切换时,另一个线程被卡住等待内存掩盖一些内存的争夺。

如果你想尝试看看是否有限的内存带宽是在扮演一个角色在这里,你可以人为地添加更多的计算的问题(例如,乘EXP(SIN(a))的COS(B)* COS(b)或东西)以确保问题是计算密集型,去掉了一个变量,当你试图去底层的东西。 编译每个系统优化,适用于特定的机器上的代码(使用-march或-xHost或你有什么)消除了另一个变量。 如果超线程已打开,将其关闭(或只是将OMP_NUM_THREADS设置为物理内核数量)摆脱另一个变量。 一旦你明白这是怎么回事在这种简化的情况下,轻松的上述一个接一个的限制,应该可以帮助您了解发生了什么事情更好一点。

事情,可以影响OPENMP的效率,例如在迭代边界的计算。 确保这些都是前手和迭代变量是本地地计算。 如果你有C99做这样的事情

#pragma omp parallel for
for (size_t i = start, is = stop; i < is; ++i) ...

以确保表达startstop都在开始评估。 (或使用_Pragma看到我其他的答案。)

那么唯一的方法,如果这真的是成功的是看汇编代码(通常是选项-S

如果不考虑其他的编译器选项gcc有选项-march=native的编译优化的实际架构。 其他平台可能有类似的选项。 首先,寻找最好的架构选项的情况下1。

这更是一个注释比一个答案。

这不是完全清楚你所测量的。 为进一步明确我会想:

  1. 插入时间在我的代码点的语句来报告执行时间。 这样,我知道我的测量,比Linux的命令时,更肯定给了我。
  2. 使用2个不同的编译器,以确保我测量一些有关的OpenMP而非之一执行它方面。

所有这一切不谈,我倾向于同意你的初步结果值得进一步调查。

其中一件事我建议你尝试正在崩溃,你的两个循环,让OpenMP的日程安排4000环,而不是4或1000。

分类:C# 时间:2012-01-01 人气:2
分享到:

相关文章

  • 版面中的OpenMP C ++ 2013-05-02

    我需要实现在C ++中的OpenMP的C#线程的效果.. Thread t=new Thread( func1 ); t.Start(); // Do something // Do something else 请注意,无论是家长还是孩子等待被加入.. 我能做到这一点在C ++中的OpenMP? 谢谢, --------------解决方案------------- OpenMP是一个更高层次的线程库比C#线程,经常被用于几乎自动地添加一些线程到串行应用. 您可以实现类似于你想要使用什么东西#

  • 处理GUI线程程序中使用OpenMP 2014-06-13

    我有一个C ++程序执行使用OpenMP并行一些冗长的计算. 现在,程序还具有响应用户输入和更新一些图形. 到目前为止,我已经开始我的计算,从主/ GUI线程,仔细平衡工作负载,使其既不是短掩盖OpenMP的线程开销也不长,所以在图形用户界面变得无法响应. 显然,我想通过同时运行一切解决这个问题. 据我所知,OpenMP的2.5不提供这样一个良好的机制. 我认为这是不适合这种类型的问题. 我也不想奉献整个核心到GUI线程,它只是需要<一个工作的10%. 我想,也许分开计算到一个单独的pthrea

  • C#/外部dll中的OpenMP WPF 2012-08-04

    我有一些C ++的lib,在托管C ++和C#/ WPF应用程序导入'胶水'lib目录'胶水'库. 直到我加入一些,一切工作正常 #pragma omp parallel for 当我编译我的C ++的lib /胶水lib和C#/ WPF应用程序,一切都很好 - 没有警告/错误. 但是,当我特里推出C#应用程序崩溃 - 但在执行某些并行代码时它不崩溃 - 它的应用程序的加载过程中崩溃 - 它说: 第一个机会异常类型的"System.Windows.Markup.XamlParseExceptio

  • 避免竞争中的OpenMP(在并行for循环) 2014-06-14

    我写在C OpenMP程序我有这样的共享阵列的"数据",这是由所有线程更新. 我想,以确保每一个线程已经完成了阅读部分和下一条语句数据[J] =临时执行前保存在温度值. 我试图把的#pragma OMP阻隔这两种说法之间,但是编译器会引发错误. 请帮忙. #pragma omp parallel for shared(data) for (j = 0; j < numints; j++){ if (j >= max_j) { temp = data[j] + data[j

  • 利用雪(降雪)与AWS为R中并行处理 2012-05-03

    关于我先前的相似,所以问题,我尝试使用AWS上的并行计算的雪/降雪. 我所做的是: 在sfInit()函数,我提供的公共DNS来socketHosts参数,像这样sfInit(parallel=TRUE,socketHosts =list("ec2-00-00-00-000.compute-1.amazonaws.com")) 错误返回Permission denied (publickey) 然后我也跟着在上http://www.imbi.uni-freiburg.de/parall

  • 强制关闭在C ++中使用OpenMP线程? 2012-08-28

    我想在运行一段时间后,将在OpenMP的线程. 我怎样才能做到这一点? --------------解决方案------------- OpenMP的线程不能从外部强行杀死. 他们没有一个手柄,你可以用它来进行操作,如加入,中断,中止,等. 事实上,OpenMP的甚至没有为此而设计的. 这是更好地只是让运行时处理线程,如果你需要做一些特殊的使用明确的线程. 我不知道是否可以为特定线程​​做到这一点,但你可以做到一招类似的东西. 你基本上做什么,你设置一个标志,当时间到了刷新,为正在运行的线程.

  • 在PHP中并行处理 2014-11-01

    我有话一个长长的清单,我要打印的名词才输出. 在我试图做到这一点的方法是: IF THE WORD IS A PROPER NOUN , JUST PRINT IT { // THIS IS DONE USING REGULAR EXPRESSION } ELSE{ // GO TO ONLINE DICTIONARY http://www.thefreedictionary.com/WORD AND SEE IF CHECK IF THE WORD IS NOUN BY HAVING ANOT

  • 在一个Qt / C使用OpenMP ++程序 2012-04-07

    我想一个并行的Qt / C ++程序使用OpenMP,所以我可以比较的Qt线程工具. 我有一些疑问. 我有什么要包括,无论是在代码和项目文件有OpenMP的正常工作? 难道是痛苦的可交付软件项目使用OpenMP的? 如果每个版本包括OpenMP和太多的维护更新? 你有什么经验与OpenMP的表现? 嵌套使用OpenMP并行值得信赖的工作? 是的OpenMP支持在同一平台的Qt作为上? 任何引用,将不胜感激. 非常感谢! --------------解决方案------------- 我有什么要包

  • OpenMP运行波动 2012-06-02

    我目前在我的FORTRAN代码中的大循环测试的OpenMP. 该代码是一个模拟模块,其从VB.NET用户界面调用的一部分; 这个接口也做了定时测量. 于是,我开始模拟,并在年​​底的软件显示我花费了多少时间(我只写这表明,定时测量我不使用wtime或CPU_TIME). 现在,当我反复开始与我并行化循环模拟,我总是得到不同的模拟倍,达到,在一个例子,从1min30sec几乎3分钟! 结果总是正确的. 我尝试了不同的时间表循环(静态,引导,动态的),我试图计算分配给手动每个线程块(做I = 1,N

  • 如何使用OpenMP这种算法的并行? 2012-07-16

    我再次在C ++中使用OpenMP时很卡. 这一次,我想实现一个平行的河内塔. 子河内(N,D,A,I)如果n = 1,则移动磁盘D到A否则河内(N-1,D,I,A)移动硬盘D到A河内(N-1,I,A ,D)结束的最终分 如何使用OpenMP的说明这个算法的并行? --------------解决方案------------- 我不认为这个算法可以OpenMPed,我有我的怀疑,还有很多并行河内求解算法中的任何塔楼. 虽然这个解决方案是递归的,不像(说)快速排序它本身不借给一个基于任务的分解;

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 4.770 (s). 10 q(s)