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) に苦しむ可能性はありますか?
ありがとうございました。