首先,我能確定的是該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.