2016-06-27 8 views
-1

2次元ベクトルを並列に変更する単純な小さなコードがあります。私はそれをそれぞれ1と4のスレッドを使ってテストしました。しかし、私はちょうど2倍以下の速度を得る。それが拡大しない理由は何も考えられません。誰も私にヒントを与えることができますか?ありがとう!C++プログラムは縮尺変更されていません

#include<iostream> 
#include<omp.h> 
#include<vector> 
#include<chrono> 
#include<stdio.h> 
using namespace std; 

typedef std::chrono::milliseconds ms; 

struct Dummy{ 
    char dummy[70]; 
    Dummy(){ 
     for(int i=0;i<70;i++){ 
      dummy[i]='a'; 
    } 
    } 
}; 

int main(){ 
    int num = 5000000; 
    vector<vector<Dummy> >myvec(4, vector<Dummy>(num)); 

    auto start = std::chrono::high_resolution_clock::now(); 

    #pragma omp parallel for schedule(static) 
    for(int i=0;i<4;i++){ //modifies myvec in parallel 
     int tid = omp_get_thread_num(); 
     printf("Thread %d is going to work\n",tid); 
     for(int j=0;j<num;j++){ 
      myvec[i][j].dummy[0]='b'; 
     } 
    } 
    auto end = std::chrono::high_resolution_clock::now(); 
    cout<<"Time used: "<< std::chrono::duration_cast<ms>(end - start).count()<<"ms"<<endl; 

    return 0; 
} 
+1

並列部分ではほとんどやっていません。メモリ性能(すべてのコア間で共有)は大きな制限要因になります。 – drescherjm

答えて

0

この場合のスケーリングが不十分な理由は、並列部分で十分に大きな計算を行わないことが主な原因です。このコード例では、メモリのパフォーマンスが最大限の制限要因になり、単一のデスクトップ/モバイルCPUではメモリサブシステムがすべてのコアで共有されるようになるため、スケーリングは期待できません。