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;
}
他のプラットフォームでスピードアップしますか? – dtech
私はVisual Studioでも同じことをしようとしていますが、私のアプリケーションがQtにあるので、Qtでそれを行う必要があります。 – Jerin
そのようなループを並列化すると、おそらくL1、L2&L3キャッシュのスラッシングが発生します。キャッシュのパフォーマンスをチェックするためのツールを入手することをお勧めします。 –