!$OMP parallel shared(l,aa)
call lin_sol_gen(l,bb,aa)
!$OMP end parallel
这样确实是没意义的 这个并行效果只是让各个线程都执行这个语句而不是协同执行这个求解过程 而且aa(我猜是存储结果的矩阵)会因为多线程而数据竞争,最终可能反而计算时间更长
楼主要多线程协同计算矩阵就要找本身支持多线程的库, 我不知道IMSL里面那些函数和有什么开关能够运行并行库, 需要你自己找找
另一方面,线性方程求解还是用到lapack库的东西, 其实优化过的MKL(AMCL应该也有)是有并行库调用的有兴趣去intel官网查查MKL文档
OpenMP开启、关闭线程的开销难以减少,提高程序运行效率只能是对程序进行优化。对一个可并行的程序来说,并不是进行了并行化改造其效率就一定会提升,若可并行区域执行时间本身就较短,OpenMP开启、关闭线程的开销很有可能抵消掉进行了并行化改造后的效益。主程序调用了多个子程序,那么这些子程序是否可以进行合并,或者是处理时间较短的子程序是否可以考虑进行串行处理。
另外,加速效果不理想除了可能是并行开销的原因之外,也有可能是并行化代码的问题。OpenMP开启的线程并不能做到处理时间的完全一致,其可能会存在某一个线程处理滞后导致先完成的线程在循环结束处等待的情况,可以使用英特尔® VTune™ 性能分析器(好像可以试用一个月)来看一下OpenMP的加速情况,不同的代码选用循环调度策略(静态、动态、指数、运行时)其加速效果也不一样。
OpenMP:
#include <iostream>
#include <mpih>
int main( int argc, char argv ){
int mynode, numnodes;
int sum, startval, endval, accum;
MPI::Status status;
MPI::Init( argc, argv );
numnodes = MPI::COMM_WORLDGet_size();
mynode = MPI::COMM_WORLDGet_rank();
sum = 0;
startval = 1000mynode/numnodes+1;
endval = 1000(mynode+1)/numnodes;
for( int i=startval; i<=endval; ++i ){
sum = sum + i;
}
if( mynode != 0 ){
MPI::COMM_WORLDSend( &sum, 1, MPI::INT, 0, 1 );
}
else{
for( int j=1; j<numnodes; ++j ){
MPI::COMM_WORLDRecv( &accum, 1, MPI::INT, j, 1,
status );
sum = sum + accum;
}
}
if( mynode == 0 )
std::cout << "The sum from 0 to 1000 is: " << sum
<< std::endl;
MPI::Finalize();
}
OpenMP和MPI是并行编程的两个手段,对比如下:
OpenMP:线程级(并行粒度);共享存储;隐式(数据分配方式);可扩展性差。
MPI:进程级;分布式存储;显式;可扩展性好。OpenMP采用共享存储,意味着它只适应于SMP,DSM机器,不适合于集群。MPI虽适合于各种机器,但它的编程模型复杂。
需要分析及划分应用程序问题,并将问题映射到分布式进程集合。需要解决通信延迟大和负载不平衡两个主要问题。
延伸论述:
我认为,要理解OpenMP和MPI,首先要有一些 *** 作系统知识和系统编程基础——OpenMP对应的实际上是单进程多线程的并发编程模型,可以将一个单线程的程序按for循环拆分成多线程——相当于pthread_create。
对于同一个进程的多个线程来说,由于它们只是独占自己的栈内存,堆内存是共享的,因此数据交换十分地容易,直接通过共享变量就可以进行交换,编程模型非常简单易用,并且对于 *** 作系统来说,线程的上下文切换成本也比进程低很多。
然而另一方面,由于线程不能脱离进程独立存在,而一个进程不能存在于多台机器上,所以OpenMP只适用于拥有多个CPU核心的单台电脑。并且多线程编程存在临界区(Critical Section),需要你自己去加锁,解决Race Condition问题,否则的话很容易导致不可预知的后果。
而MPI则是多进程的并发编程模型,相当于你自己调用fork——每一个进程的内存地址空间都是独立的,它们彼此之间几乎什么都不共享,只能通过进程间通信(IPC)来交换彼此的数据,因此编程难度明显要大很多。
MPI有一个非常显著的优点,那就是对于一个分布式系统来说,进程是可以在分布式系统的每一台电脑之间转移的,因此对于拥有多台电脑的分布式系统来说,其并发性要明显好于OpenMP。
以上就是关于请教IMSL里的函数如何用OpenMP进行并行处理全部的内容,包括:请教IMSL里的函数如何用OpenMP进行并行处理、怎样才能避免openmp反复开启和关闭线程带来的计算时间 消耗、用openmp并行编程计算100的阶乘等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)