0

Microblaze プロセッサで実行されている OpenMP 実装 "GOMP" (つまり、GNU OpenMP) に問題があります。MicroBlaze プロセッサはカーネル メインラインにあり、ザイリンクスは pthread インプリメンテーションを提供しています。そこで、pthread の実装から始めて GOMP ライブラリをクロスコンパイルし、Microblaze (Petalinux という名前の 3.10 バージョン) で実行されている Linux カーネルに挿入しました。具体的には、Parsec ベンチマークの 1 つ (ここにリンク ( http://parsec.cs.princeton.edu/download.htm ) があります)、つまり blackscholes を実行すると問題が強調されます。問題を示すコード セクションは次のとおりです。

int bs_thread(void *tid_ptr) {
    int i, j;
    fptype price;
    fptype priceDelta;
    int tid = *(int *)tid_ptr;

    for (j=0; j<NUM_RUNS; j++) { 
#pragma omp parallel for private(i, price, priceDelta)
        for (i=0; i<numOptions; i++) {

            price = BlkSchlsEqEuroNoDiv( sptprice[i], strike[i],rate[i], volatility[i], otime[i], otype[i], 0);
            prices[i] = price;
            } 
    } 

return 0;

}

blackscholesは、次のコマンドを使用して、さまざまな入力セットとさまざまなスレッド番号で起動できます 。

1、2、3、5、7 のスレッドで起動し、奇数をたどるとうまくいきます。4、6、8、10 スレッドなどで起動し、偶数に続いてブロックします。ここでも、定数 NUM_RUNS を 1 に減らすことで、アプリケーションは適切に機能します。私の質問は次のとおりです: GOMP 実装が for サイクルの後にワークシェアリング構造の挿入 (つまり、omp parallel for) に苦しむ可能性はありますか?

ありがとうございました。

4

0 に答える 0