在Linux SMP上增加线程和不存在的加速
我用boost :: thread写了一个小例子C ++程序。由于它是215行,我把它贴在了pastebin上
http://pastebin.com/LRZ24W7D
该程序创建了大量的浮点数(目前为1gb),然后按顺序添加它们,然后使用多个线程(托管在device_matrix类中)。假设机器是SMP,我希望看到代码加速。在我的Windows机器上,当我使用4个device_matrix实例(在我的双核超线程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
我读到的机器有八个核心(井,四核与HT)
我正在使用以下行在Windows上编译我的程序:
cl /Fe"boost.exe" /EHsc -I. boost.cpp /link /LIBPATH:"C:boostboost_1_45_0stagelib"
在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的示例程序,这可能会给我一些基准测试,但我只是找到了一些小型的生产者 - 消费者的例子,不需要任何“重”的东西。
作为额外的事情,使用time命令,使用一个线程给出以下时间(以防万一boost :: timer is wonky):
real 0m9.788s
user 0m9.500s
sys 0m0.280s
当使用8个线程时,我看到以下内容:
real 0m7.292s
user 0m10.340s
sys 0m0.340s
这似乎并不表示任何更快的运行。
我还应该提一下,我是一个普通的用户帐户,而且我自己构建了boost(因此,在Linux上为此目的在“普通”文件夹之外链接它。)这也意味着我受到严重限制在我可以安装什么,等等有没有类似的限制适用于线程?
没有找到相关结果
已邀请:
1 个回复
味芯憨
。如果我使用
然后减去,我得到不同的计时结果。 看起来好像
,这是
使用的,返回整个程序使用的CPU时间量,而不仅仅是一个线程。对我来说这看起来像一个Boost bug。 我在CentOS 5机器上制作了与Boost兼容的代码的新版本。我将do_sum操作修改为自由函数,因此我保证sum的计算方式与单线程和多线程的完全相同。我添加了一个非Windows标头,所以我可以使用gettimeofday。 代码在这里。