1

boost::thread を使用して、小さなサンプル C++ プログラムを作成しました。215行なので代わりにペーストビンに投稿しました

http://pastebin.com/LRZ24W7D

このプログラムは多数の float (現在は 1gb) を作成し、最初は順番に、次に多数のスレッド (device_matrix クラス内でホストされている) を使用してそれらを加算します。マシンが SMP であると仮定すると、コードのスピードアップが期待できます。また、私の Windows マシンでは、4 つの device_matrix インスタンスを使用すると、4 倍のスピードアップが見られます (デュアルコア ハイパースレッディング Intel Core2 CPU で 4 つのスレッドを指定)。Windows での出力は次のとおりです。

starting computation
device_matrix count       4
elements                  268435456
UINT_MAX                  4294967295
data size total           1024 mb
size per device_matrix    256 mb
reference                 134224128.00000
result                    134224128.00000
time taken (init)         12.015 secs
time taken (single)       3.422 secs
time taken (device)       0.859 secs

ただし、利用可能な Ubuntu マシンで同じコードをコンパイルすると、次の出力が表示されます。

starting computation
device_matrix count       8
elements                  268435456
UINT_MAX                  4294967295
data size total           1024 mb
size per device_matrix    128 mb
reference                 134215408.00000
result                    134215400.00000
time taken (init)         3.670 secs
time taken (single)       3.030 secs
time taken (threaded)     3.950 secs

ここでは、速度の向上は見られません (実際、かなり遅くなります)。

私が使用しているUbuntuマシンには、次のuname -a出力があります

Linux gpulab03 2.6.32-23-generic #37-Ubuntu SMP Fri Jun 11 08:03:28 UTC 2010 x86_64 GNU/Linux

hwinfo -short を実行すると、次の出力が得られます。

cpu:
                       Intel(R) Core(TM) i7 CPU         930  @ 2.80GHz, 1600 MHz
                       ... 7 more times

私はこれを 8 コア (まあ、HT を備えたクアッド コア) を持つマシンと読みました

次の行を使用して、Windows でプログラムをコンパイルしています。

cl /Fe"boost.exe" /EHsc -I. boost.cpp /link /LIBPATH:"C:\boost\boost_1_45_0\stage\lib"

Ubuntu では、次の行を使用します。

g++ -O0 -v -o boost -I$HOME/Code/boost -L$HOME/Code/boost/stage/lib boost.cpp -lboost_thread-gcc44-mt

上記の行を実行したときの出力は、誰にでもわかるようにhttp://pastebin.com/Gj6W3pcsです。

私は Linux での開発に慣れていないので、何を探すべきかわかりません。実際の同時スレッドを取得するために、GCC に渡す必要があるフラグや、どこかで有効にする必要がある設定はありますか?

私は、boost::thread を使用したサンプル プログラムをネットで調べました。これにより、ベンチマークの対象となる可能性がありますが、「重い」ものを処理する必要のない小さなプロデューサー/コンシューマーの例しか見つかりません。

さらに、1 つのスレッドで time コマンドを使用すると、次の時間が得られます (boost::timer が不安定な場合に備えて)。

real    0m9.788s
user    0m9.500s
sys     0m0.280s

8 スレッドを使用すると、次のようになります。

real    0m7.292s
user    0m10.340s
sys     0m0.340s

とにかく、これはより速い実行を示しているようには見えません。

また、私は通常のユーザー アカウントを使用しており、自分自身でブーストを構築したことにも言及する必要があります (したがって、Linux でこの目的のために「通常の」フォルダーの外でブーストをリンクしています)。何をインストールできるかなど、スレッドに何らかの形で適用される同様の制限はありますか?

4

1 に答える 1

2

問題はにあると思いますboost::timergettimeofday代わりに減算を使用すると、異なるタイミング結果が得られます。

use である が、1 つのスレッドだけでなく、プログラム全体で使用された CPU 時間を返してclock()いるように見えます。boost::timerこれは、Boost バグのように見えます。

CentOS 5 マシンの Boost と互換性のある新しいバージョンのコードを作成しました。do_sum 操作をフリー関数に変更したので、シングルスレッドとマルチスレッドで合計がまったく同じ方法で計算されることが保証されました。gettimeofday を使用できるように、Windows 以外のヘッダーを追加しました。

コードはこちらです。

于 2011-02-17T23:08:55.697 に答える