OpenMPによる動的計画法の並列化/ベクトル化

マーメラッド

動的計画法を使用して最小コストのポリゴン三角形分割を計算し、OpenMPを使用してそれを並列化/ベクトル化する関数を作成しようとしています。これまでに作成したコードは正しい結果を返しますが、速度が遅すぎます。3000ポイントを超えるポリゴンの場合、5分経っても停止しません。コードは次のとおりです。

#pragma omp declare simd
float dist(float x1, float y1, float x2, float y2)
{
    return sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
}

float triangulate(const vector<Point> &points) {

int n = points.size();

vector<vector<float>> table (n, vector<float>(n, 0));

int threads = omp_get_max_threads();

for (int gap = 0; gap < n; ++gap)
{
    for (int i = 0, j = gap; j < n; ++i, ++j)
    {
        if (j < i+2)
            table[i][j] = 0.0;
        else
        {
            int size = j - i - 1;

            Point p1 = points[i], p2 = points[j];
            //Precompute distance between i and j
            float ij = dist(p1.x, p1.y, p2.x, p2.y);

            float minimum = MAX;
            #pragma omp parallel for simd schedule(static, 64) num_threads(threads) reduction(min:minimum) if(size > 300)
            for (int k = i+1; k < j; ++k)
            {
                Point p3 = points[k];

                float perimeter = ij + dist(p1.x, p1.y, p3.x, p3.y) + dist(p2.x, p2.y, p3.x, p3.y) + table[i][k] + table[k][j];

                if(perimeter < minimum)
                {
                    minimum = perimeter;
                }
            }

            table[i][j] = minimum;
        }
    }
}

return table[0][n-1];
}

ギャップとi、j forループimhoは並列化できないため、k上のforループのみを並列化できます。私はスケジュールの議論と一緒に遊んでみましたが、改善はありませんでした。私は何かが足りないのですか、それともこのアプローチではこの機能だけを速くすることはできませんか?

ブライス

i/で並列化してみませんjか?与えられたI / jのペアについて、境界を計算するだけの値に依存しているtable[i][k]table[k][j]の間のギャップikの間、またはkjの間よりも小さくなるij最も外側のループgapが順番に実行されている限り、i/の内側のループにj恥ずかしい並列処理プロパティがあり、予防策なしで並列化できます。

// Do this here so that we can dispose of the if/then/else in the loop later
table[0][0] = 0.0;
for (int i= 1; i < n; ++i){
    table[i][i-1] = 0.0;
    table[i][i]   = 0.0;
}

// spawn parallel threads here
#pragma omp parallel default(shared)
for (int gap = 2; gap < n; ++gap)
{
    // Loop on i will now be distributed among threads
    // Not sure that is possible to place two variables in the loop definition
    // so loop on i and compute the corresponding value of j
    #pragma omp for
    for (int i = 0; i < n-gap; ++i)
    {
        int j=i+gap; 
        int size = gap - 1;

        Point p1 = points[i], p2 = points[j];
        //Precompute distance between i and j
        float ij = dist(p1.x, p1.y, p2.x, p2.y);

        float minimum = MAX;

        // remove of all directives but simd
        #pragma omp simd reduction(min:minimum)
        for (int k = i+1; k < j; ++k)
        {
            Point p3 = points[k];

            float perimeter = ij + dist(p1.x, p1.y, p3.x, p3.y) + dist(p2.x, p2.y, p3.x, p3.y) + table[i][k] + table[k][j];

            if(perimeter < minimum)
                minimum = perimeter;
        }

        table[i][j] = minimum;
    } // implicit barrier, all threads will wait here for loop completion before moving to next value of gap
} //end of loop, end of parallel region

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

動的計画法テーブルを埋めるネストされたforループのベクトル化

分類Dev

動的計画法によるテキスト正当化の時間計算量

分類Dev

動的計画法による無制限のナップザックの最小化

分類Dev

OpenMPの並列化はベクトル化を阻害します

分類Dev

動的計画法-配列の合計を最小化する

分類Dev

Numpyベクトル演算の並列化

分類Dev

動的計画法、コストの最小化?

分類Dev

動的計画法による文字列操作

分類Dev

デフォルトの文字列によるベクトル内の文字列の初期化の簡略化

分類Dev

変数のベクトル構文を使用したPULPによる2進整数計画法?

分類Dev

OpenMPインクリメントループを並列化する方法

分類Dev

この大規模な配列計算をベクトル化して高速化するにはどうすればよいですか?

分類Dev

大きなベクトルの合計を並列に計算する

分類Dev

Javaでの動的計画法による最小コスト

分類Dev

forループ内のOpenMP並列化に時間がかかりすぎる

分類Dev

Cのopenmpで、qsortのネストされた比較関数を含むforループを並列化するにはどうすればよいですか?

分類Dev

ベクトルによる行列演算のグループ化を計算するための効率的な戦略

分類Dev

numpy によるベクトル化

分類Dev

OpenMPを使用してこの配列の合計を並列化する方法は?

分類Dev

(ベクトル化によって)15行を並列に計算し、それらを使用してdfを作成します

分類Dev

メモ化の追加-動的計画法

分類Dev

レーベンシュタインアルゴリズムによる動的計画法の使用方法(Javascript)

分類Dev

レーベンシュタインアルゴリズムによる動的計画法の使用方法(Javascript)

分類Dev

Java:マルチスレッドによるクイックソートの並列化

分類Dev

PuLPによる線形計画法のサラダ混合物の最適化

分類Dev

動的および非動的計画法におけるネストされたループの再帰の複雑さ

分類Dev

外積によるベクトル化された合計削減-NumPy

分類Dev

Rでのベクトル化(サブセット化)による割り当て

分類Dev

動的計画法アルゴリズムの漸化式を定式化した後、どのように表に記入できますか?

Related 関連記事

  1. 1

    動的計画法テーブルを埋めるネストされたforループのベクトル化

  2. 2

    動的計画法によるテキスト正当化の時間計算量

  3. 3

    動的計画法による無制限のナップザックの最小化

  4. 4

    OpenMPの並列化はベクトル化を阻害します

  5. 5

    動的計画法-配列の合計を最小化する

  6. 6

    Numpyベクトル演算の並列化

  7. 7

    動的計画法、コストの最小化?

  8. 8

    動的計画法による文字列操作

  9. 9

    デフォルトの文字列によるベクトル内の文字列の初期化の簡略化

  10. 10

    変数のベクトル構文を使用したPULPによる2進整数計画法?

  11. 11

    OpenMPインクリメントループを並列化する方法

  12. 12

    この大規模な配列計算をベクトル化して高速化するにはどうすればよいですか?

  13. 13

    大きなベクトルの合計を並列に計算する

  14. 14

    Javaでの動的計画法による最小コスト

  15. 15

    forループ内のOpenMP並列化に時間がかかりすぎる

  16. 16

    Cのopenmpで、qsortのネストされた比較関数を含むforループを並列化するにはどうすればよいですか?

  17. 17

    ベクトルによる行列演算のグループ化を計算するための効率的な戦略

  18. 18

    numpy によるベクトル化

  19. 19

    OpenMPを使用してこの配列の合計を並列化する方法は?

  20. 20

    (ベクトル化によって)15行を並列に計算し、それらを使用してdfを作成します

  21. 21

    メモ化の追加-動的計画法

  22. 22

    レーベンシュタインアルゴリズムによる動的計画法の使用方法(Javascript)

  23. 23

    レーベンシュタインアルゴリズムによる動的計画法の使用方法(Javascript)

  24. 24

    Java:マルチスレッドによるクイックソートの並列化

  25. 25

    PuLPによる線形計画法のサラダ混合物の最適化

  26. 26

    動的および非動的計画法におけるネストされたループの再帰の複雑さ

  27. 27

    外積によるベクトル化された合計削減-NumPy

  28. 28

    Rでのベクトル化(サブセット化)による割り当て

  29. 29

    動的計画法アルゴリズムの漸化式を定式化した後、どのように表に記入できますか?

ホットタグ

アーカイブ