multithreading - 在 Linux SMP 上 boost 线程和不存在的 boost

标签 multithreading boost ubuntu boost-thread smp

我使用 boost::thread 编写了一个小示例 C++ 程序。因为它是 215 行,所以我把它贴在了 pastebin 上

http://pastebin.com/LRZ24W7D

该程序创建大量浮点数(当前为 1gb)并将它们相加,首先是按顺序进行,然后使用多个线程(托管在 device_matrix 类中)。假设机器是 SMP,我希望从代码中看到 boost 。在我的 Windows 机器上,当使用 4 个 device_matrix 实例(在我的双核超线程 Intel Core2 CPU 上提供 4 个线程)时,我看到了四倍的 boost 。 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

在这里,没有看到 boost (事实上,它慢了很多)。

我正在使用的 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:\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 上将其链接到“普通”文件夹之外。)这也意味着我已经受到严格限制我可以安装什么等等。是否有类似的限制适用于线程?

最佳答案

我相信问题出在 boost::timer .如果我使用 gettimeofday,我会得到不同的计时结果并减去。

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

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

The code is here.

关于multithreading - 在 Linux SMP 上 boost 线程和不存在的 boost ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5029904/

相关文章:

c++ - 设计需要暂存空间的算法

boost - 对象 boost::asio::io_service 的方法 post() 是否使用 boost::coroutines 来执行短任务?

c++ - 使用 boost::lexical_cast 将 std::string 的 std::array 转换为相同大小的 std::tuple

java - 有效地使用 UncaughtExceptionHandler

java.security.AccessControlException : Occured when Running an applet

objective-c - 从 C++ 循环启动 Cocoa GUI 并传递引用

ubuntu - 从 ubuntu 中删除旧构建的 erlang

c++ - 如何在 C++ 中利用多 CPU?

linux - Ubuntu 符号链接(symbolic link)在 up 文件夹时转到源位置

ios - iOS 10 和 Ubuntu 上的 libimobiledevice 出现 TLS 错误