仮想ボックスで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 で両方のコードをコンパイルしました。結果は次のとおりです。
- デバッグモードでは、両方のコードがほぼ同じ時間で与えられ、その時間は GCC によって与えられる時間に近いです。
- リリース モード: どちらのコードも高速で、並列コードは時間の大幅な改善を示しています。一言で言えば問題:
- Visual Studio のコンパイラのリリース バージョンと同じ効率で、プログラムを並列に実行したいと考えています。
"-fopenmp"
2)ビジュアルスタジオとまったく同じようにリリースバージョンをビルドする以外に、GCCに渡す必要があるパラメーターまたはオプションはありますか。3)それがUbuntuの問題なのか、GCCの問題なのか、それとも何なのか知りたい???
PS : wubi をインストールした Ubuntu と、スタンドアロン OS としての Ubuntu (ext4 ファイル システム上) および同じプラットフォームで同じ手順を実行しようとしましたが、同じ結果が得られました。