2016-10-24 8 views
1

In VS 2013ここでコードは、OpenMPを使用してforループで並列処理を行う場合の速度向上をもたらしません。私は20msにかかる時間を短縮したい。出来ますか?OpenMPでQtを実行しても、Windowsで高速化ができません。Visual Studio 2013とQt 5.5を使用しています。

現在の実行時間は、Openmpの有無にかかわらず約150msです。

speedtest.pro 

TEMPLATE = app 
CONFIG += console c++11 
CONFIG -= app_bundle 
CONFIG -= qt 
SOURCES += main.cpp 
QMAKE_CXXFLAGS += -openmp 

あなたはQtので#pragma omp parallel for

#pragma omp parallel for 
for(int i=0;i<N;++i) 
{ 
    //.... 
} 

のためにあなたが.PROファイルに、追加する必要が前に追加する必要がmain.cppに

#include <iostream> 
#include <chrono> 
#include <ctime> 
#include <omp.h> 
#include <conio.h> 
using namespace std; 

void fun(bool *c, int *a, int aSize, int *b, int bSize) 
{ 
    #pragma omp parallel for 
    for (int i = 0; i<aSize; i++){ 
     for (int j = 0; j<bSize; j++) 
      if ((a[i*3] - b[j*3])*(a[i*3] - b[j*3]) + 
       (a[i*3 + 1] - b[j*3 + 1])*(a[i*3 + 1] - b[j*3 + 1]) 
       + (a[i*3 + 2] - b[j*3 + 2])*(a[i*3 + 2] - b[j*3 + 2])<30) 
       c[i*bSize + j] = 1; 
    } 
} 


int main() 
{ 

    const int aSize = 16000; 
    const int bSize = 6000; 

    int *a = new int[aSize*3]; 
    int *b = new int[bSize*3]; 
    bool *c = new bool[aSize*bSize]; 

    for (unsigned int i = 0; i < aSize; i++){ 
     a[i*3] = (int)i; 
     a[i*3 + 1] = (int)i; 
     a[i*3 + 2] = (int)i; 
    } 
    for (unsigned int i = 0; i < bSize; i++){ 
     b[i*3] = (int)i; 
     b[i*3 + 1] = (int)i; 
     b[i*3 + 2] = (int)i; 
    } 

    for (unsigned int i = 0; i < aSize*bSize; i++){ 
     c[i] = 0; 
    } 

    std::chrono::time_point<std::chrono::system_clock> start, end; 
    start = std::chrono::system_clock::now(); 



    fun(c, a, aSize, b, bSize); 


    end = std::chrono::system_clock::now(); 


    int c1 = 0; 
    for (unsigned int i = 0; i < aSize*bSize; i++){ 
     if (c[i] == 0){ 
      c1 = 1; break; 
     } 
    } 

    if (c1 == 1) 
     cout << "Collision" << endl; 
    else 
     cout << "No collision" << endl; 

    std::chrono::duration<double> elapsed_seconds = end - start; 
    std::time_t end_time = std::chrono::system_clock::to_time_t(end); 

    std::cout << "finished computation at " << std::ctime(&end_time) 
     << "elapsed time: " << 1000 * elapsed_seconds.count() << "ms\n"; 
    getch(); 
     delete [] a; 
     delete [] b; 
     delete [] c; 


    return 0; 
} 
+0

他のプラットフォームでスピードアップしますか? – dtech

+0

私はVisual Studioでも同じことをしようとしていますが、私のアプリケーションがQtにあるので、Qtでそれを行う必要があります。 – Jerin

+0

そのようなループを並列化すると、おそらくL1、L2&L3キャッシュのスラッシングが発生します。キャッシュのパフォーマンスをチェックするためのツールを入手することをお勧めします。 –

答えて

1

QMAKE_CXXFLAGS += -fopenmp 
QMAKE_LFLAGS += -fopenmp 
+0

#pragma omp parallel for for(int i = 0; i Jerin

+0

コードを「書く」方法を知る必要はありません。通常どおり書いて、それを選択し、 '{}'ボタンをクリックしてください。それで全部です! –

+0

ヒントありがとう – Alexandre

0

時計で時間を測定しないでください!クロックティックを測定します。多くのCPUコアを使用している場合は、結果が間違っている可能性があります。

たとえば、std::chrono

+0

それはコメントする必要があります。 – dtech

+0

@ddriverなぜですか?これは、測定時間が同じ理由である可能性があります。私はVSを持っていないのでそれをチェックしませんが、これは私の推測です。 – foxfireee

+0

clock()はあまり正確ではありませんが、それほど正確ではありません** – dtech

関連する問題