在Linux SMP上提升线程和不存在的加速

时间:2011-02-17 14:02:04

标签: multithreading boost ubuntu boost-thread 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

我读到的机器有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的示例程序,它可以给我一些基准测试的东西,但我只是找到了一些小的生产者 - 消费者的例子,不需要处理任何“重的” ”

作为一个额外的事情,使用time命令,使用一个线程给出以下时间(以防万一,boost :: timer很难):

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

当使用8个线程时,我看到以下内容:

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

这似乎并不表示任何更快的运行。

我还应该提一下,我使用普通用户帐户,并且我自己构建了boost(因此,为了这个目的,在Linux上将其链接到“普通”文件夹之外。)这也意味着我在我可以安装的东西等方面受到严重限制。是否存在类似于线程的限制?

1 个答案:

答案 0 :(得分:2)

我认为问题出在boost::timer上。如果我使用gettimeofday并相反减去,我会得到不同的时间结果。

看起来好像clock()boost::timer使用的是返回整个程序使用的CPU时间量,而不仅仅是一个线程。这看起来像是一个Boost bug。

我在CentOS 5计算机上创建了与Boost兼容的新版本代码。我将do_sum操作修改为自由函数,因此我保证sum的计算方式与单线程和多线程的完全相同。我添加了一个非Windows标头,所以我可以使用gettimeofday。

The code is here.