一、openMP简单测试
1、简述
-
openMP很多情况下对于利用多核处理器进行加速是很有效果的,然而,也有一些情况是openMP不但没有效果,甚至还有一些反作用。
2、简单测试(1)
-
#include<omp.h>
#include<time.h>
#include<iostream>
using namespace std;void openMP()
{
int i,j;
for(i=; i<; i++)
{
for( j = ; j < ; j++)
j++;
}
}int main()
{
time_t start,end1;
time( &start );
double omp_start = omp_get_wtime( );
int N = ;
int i,j;
#pragma omp parallel
for(int m = ; m < N ; m++)
{
openMP(); } double omp_end = omp_get_wtime( );
time( &end1 );
std::cout<<"used_times "<<end1 - start<<"\n";
std::cout<<"omp_times "<<omp_end - omp_start<<"\n"; return ;
}
- 从上面可以看出,使用openMP并行化程序并没有比不使用openMP的要快,甚至线程数量越大的情况下,运行时间反而越长。
- 这是因为,数据量巨大,线程数量越多的时候,程序分配并行程序的时间越多,导致程序的运行时间变慢。这种情况下,使用openMP设置的线程数量越多,效果会越差。
3、简单测试(2)
-
#include<omp.h>
#include<time.h>
#include<iostream>
using namespace std;void openMP()
{
int i,j;
for(i=; i<; i++)
{
for( j = ; j < ; j++)
j++;
}
}int main()
{
time_t start,end1;
time( &start );
double omp_start = omp_get_wtime( );
int N = ;
int i,j;
#pragma omp parallel for
for(int m = ; m < N ; m++)
{
openMP(); } double omp_end = omp_get_wtime( );
time( &end1 );
std::cout<<"used_times "<<end1 - start<<"\n";
std::cout<<"omp_times "<<omp_end - omp_start<<"\n"; return ;
}
- 从上面的图表可以看出,使用openMP以及扩大线程数量与不使用openMP的程序运行时间相差无几
- 这是因为循环一次的情况下,openMP无论设置了多少个线程,所使用的CPU利用率,系统最大会分配给100%,也就是一个线程的CPU利用率,也就和不使用openMP没有什么差别,这种情况下,openMP是没有什么效果的。
二、openMP学习参考
- 通过 GCC 学习 OpenMP 框架:https://www.ibm.com/developerworks/cn/aix/library/au-aix-openmp-framework/
-
Guide into OpenMP : http://bisqwit.iki.fi/story/howto/openmp/