首先,我能确定的是该OPENMP测试程序通过Qt自带的MINGW编译器直接编译有效,但是我没有对VS编译器进行测试,究竟有没有提升,提升了多少我没有进行测试,因为普通的垃圾代码会被VS优化。
首先是pro文件
QMAKE_CXXFLAGS+=/openmp
QMAKE_CFLAGS += /fopenmp
有的地方说只插入第一个行即可,但是保险起见,两个都写上。
测试C文件
值得注意的是需要加上#include <omp.h>
在需要多线程的for循环前,加上#pragma omp parallel for
#include <stdio.h>
#include <omp.h>
#include<QTime>
#include<QDebug>
#include<iostream>
using namespace std;
void test (int n) {
//这种垃圾代码会被VS编译器优化,因此很难看出差距
for(int i = 0; i < 100000+n; ++i)
{
}
printf("n %d ", n);
}
int main(void)
{
std::cout << "parallel begin:\n";
std::cout<< "omp_get_max_threads:" << omp_get_max_threads()<<endl;
#pragma omp parallel for num_threads(8)
for(int i = 0; i < 8; ++i)
{
std::cout << omp_get_thread_num();
}
std::cout << "\n parallel end.\n";
QTime time;
time.start();
for(int i = 0; i < 200; ++i)
test(i);
printf("\n");
int times1=time.elapsed();
qDebug()<<times1<<"ms";
#pragma omp parallel for
for(int i = 0; i < 200; ++i)
test(i);
printf("\n");
int times2=time.elapsed();
qDebug()<<times2-times1<<"ms";
return 0;
}
经Qt自带的MINGW编译器编译后,第一段的运行时为74ms,第二段的运行时间为15ms,分成了8个线程,但是因为多线程有调度损耗,因此实际耗时为原来的1/5.