boost::thread を使用して、小さなサンプル C++ プログラムを作成しました。215行なので代わりにペーストビンに投稿しました
このプログラムは多数の 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 でこの目的のために「通常の」フォルダーの外でブーストをリンクしています)。何をインストールできるかなど、スレッドに何らかの形で適用される同様の制限はありますか?