1

仮想ボックスでUbuntu 12を実行しており、GCCを使用して、単純なOpenMpプラグマを持つこの単純なCプログラムをコンパイルしています:

#include <stdio.h>
#include <omp.h>
#define MAX 10000000000
void main()
{
    unsigned long long i,j,k,l;
    int threadnumber;
    #pragma omp parallel shared(i,j,k,l)
    {
        threadnumber = omp_get_thread_num();
        if(threadnumber == 0)
        {
            for(i = 0; i < (MAX / 4); i++)
                ;
        }
        else if(threadnumber == 1)
        {
            for(j = (MAX / 4); j < (MAX / 2); j++)
                ;
        }
        else if(threadnumber == 2)
        {
            for(k = (MAX / 2); k < (3 * (MAX / 4));k++)
                ;
        }
        else
        {
            for(l = (3 * (MAX / 4)); l < MAX; l++)
                ;
        }
    }
}

私のプロセッサは Intel Core i5 のものです。プログラムは実際に並列で動作しています (いくつかの printf() を追加して検証)。環境変数 (OMP_NUM_THREADS) を 4 に設定しました。問題は、並列ではないこのコードよりも多くの時間がかかっていることです。

#include <stdio.h>
#define MAX 10000000000
void main()
{
    unsigned long long i;
    for(i = 0; i < MAX; i++)
        ;
}

clock()また、両方のバージョンでループの前後に呼び出しを追加しようとしましたが、並列バージョンでより長い時間を取得しています。また、 : time を使用して時間を測定しようとし./a.outましたが、(並列バージョンでのみ) clock()!

Visual Studio で両方のコードをコンパイルしました。結果は次のとおりです。

  1. デバッグモードでは、両方のコードがほぼ同じ時間で与えられ、その時間は GCC によって与えられる時間に近いです。
  2. リリース モード: どちらのコードも高速で、並列コードは時間の大幅な改善を示しています。一言で言えば問題:
  3. Visual Studio のコンパイラのリリース バージョンと同じ効率で、プログラムを並列に実行したいと考えています。"-fopenmp"2)ビジュアルスタジオとまったく同じようにリリースバージョンをビルドする以外に、GCCに渡す必要があるパラメーターまたはオプションはありますか。3)それがUbuntuの問題なのか、GCCの問題なのか、それとも何なのか知りたい???

PS : wubi をインストールした Ubuntu と、スタンドアロン OS としての Ubuntu (ext4 ファイル システム上) および同じプラットフォームで同じ手順を実行しようとしましたが、同じ結果が得られました。

4

2 に答える 2

7

OpenMPclock()にポータブルな高解像度タイマーがあり、omp_get_wtime()?

まず、並列領域内で共有変数をループ カウンターとして使用することは、ひどい考えです。これが理由ですが、Nehalem 以降のマイクロアーキテクチャ ベースの CPU を使用しているため、この問題が軽減されます

次に、Visual Studio は、デバッグ構成とリリース構成で異なる最適化レベルを適用します。デバッグ モードでは最適化が無効になり ( /Od)、リリース モードでは速度の最適化が有効になります ( /O2)。デバッグ モードでは、VS コードは GCC コードと同じくらい高速に動作するとおっしゃっています。これはおそらく、最適化なしのデフォルトの最適化レベルで GCC を実行していることを意味します。リリース モードで VS が生成するものと同等のコードを取得するために、-O2または を使用してコンパイルします。-O3

3 番目に、仮想マシン内で Ubuntu を実行しています。仮想マシンがアクセスできる CPU の数は?

第 4 に、なぜ OpenMP 並列forワークシェアリング ディレクティブを再実装するのですか?

于 2012-06-29T11:14:14.850 に答える
1

このような単純な測定から結論を引き出すことに注意してください。ここにあるような空のループは、ほとんどの最新のコンパイラーが完全に最適化されているはずです。OMPこのような最適化は、ここではプラグマによって少し妨げられる可能性があります。しかし、これは実際には並列処理とは関係ありません。

于 2012-06-28T19:00:11.893 に答える