2017-05-02 8 views
0

OpenMPまたはCUDAを使用してこのループをスピードアップできるかどうか疑問に思っています。現在のところ、それは逐次処理と細かい動作しますが、私のコーディングを最適化しようとしている私は「M:私は効果なしで、次の試してみた処理を並列化するための努力においてスピードアップforループwith .push_back

for (int curCol = 0; curCol < numRows; ++curCol){  //Long Loop 
     int lb = csc_colIndices[curCol]; 
     int ub = csc_colIndices[curCol + 1]; 

     // push back the diagonal value to L matrix 
     vec_L_val[curCol].push_back(1.0f); 
     vec_L_indices[curCol].push_back(curCol); 

     for (int curIndex = lb; curIndex < ub; ++curIndex){ 
      int curRow = csc_indices[curIndex]; 
      float curVal = csc_val[curIndex]; 

      if (!Equal(curVal, 0) && curRow <= curCol){// U entry 
       vec_U_val[curCol].push_back(curVal); 
       vec_U_indices[curCol].push_back(curRow); 
      } 
      else if (!Equal(curVal, 0) && curRow > curCol){// L entry 
       vec_L_val[curCol].push_back(curVal); 
       vec_L_indices[curCol].push_back(curRow); 
      } 
     } 
    } 

#pragma omp parallel for private(curCol) shared(curIndex) 

マイ?

どのように私はこのコードを向上させることができます...疑いが.push_backの使用であるが、私は間違っている可能性が

+1

ベクターに初期サイズを与えていますか? – user743414

+0

あなたはvec_L_valなどを参照していますか?もしそうなら、はい。 – ceeely

+0

複数のスレッドが同時にリソースを競合するため、 'std :: vector'sを満たすことは並列処理には適していません。私は、充填をシーケンシャルな操作として残し、むしろ後でこれらのベクトルを修正しないで並列処理を利用することに集中します。 – acraig5075

答えて

0

最初の事前割当て全部:

for (int curCol = 0; curCol < numRows; ++curCol) 
{ 
    vec_L_val[curCol].resize(SIZE_OF_THE_INNER_VECTOR); 
    vec_L_indices[curCol].resize(SIZE_OF_THE_INNER_VECTOR); 
    vec_U_val[curCol].resize(SIZE_OF_THE_INNER_VECTOR) 
    vec_U_indices[curCol].resize(SIZE_OF_INNER_VECTOR) 
} 

内部ループ構造の内部に再アロケーションが必要ないため、内側ループがおそらくより速く動作するでしょう。

for (int curCol = 0; curCol < numRows; ++curCol){  //Long Loop 
    int lb = csc_colIndices[curCol]; 
    int ub = csc_colIndices[curCol + 1]; 

    // push back the diagonal value to L matrix 
    vec_L_val[curCol].push_back(1.0f); 
    vec_L_indices[curCol].push_back(curCol); 

    for (int curIndex = lb; curIndex < ub; ++curIndex){ 
     int curRow = csc_indices[curIndex]; 
     float curVal = csc_val[curIndex]; 

     if (!Equal(curVal, 0) && curRow <= curCol){// U entry 
      vec_U_val[curCol].push_back(curVal); 
      vec_U_indices[curCol].push_back(curRow); 
     } 
     else if (!Equal(curVal, 0) && curRow > curCol){// L entry 
      vec_L_val[curCol].push_back(curVal); 
      vec_L_indices[curCol].push_back(curRow); 
     } 
    } 
} 
+0

私はそれを試してみるでしょう、提案していただきありがとうございます。 – ceeely

+0

こんにちはTomaz、私はあなたの解決策を試しましたが、代わりにプログラムを停止しました。それにもかかわらず、提案に感謝します! – ceeely

+0

は、サイズのベクトルのサイズを変更して停止しましたか?これは、データを扱うメモリがない場合にのみ可能です。 –