Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;独立数据的多线程性能 让我们拥有一个非常简单的C++类,它只有一个数据成员: class Container { public: std::vector<Element> elements; Container(int elemCount); };_C++_Multithreading_Performance - Fatal编程技术网

C++;独立数据的多线程性能 让我们拥有一个非常简单的C++类,它只有一个数据成员: class Container { public: std::vector<Element> elements; Container(int elemCount); };

C++;独立数据的多线程性能 让我们拥有一个非常简单的C++类,它只有一个数据成员: class Container { public: std::vector<Element> elements; Container(int elemCount); };,c++,multithreading,performance,C++,Multithreading,Performance,对于最大为100.000个元素的向量大小,计时与预期完全相同: Elements count: 100.000 Threads: 1 loops: 10000 ms: 650 Threads: 4 loops: 2500 ms: 168 loops: 2500 ms: 169 loops: 2500 ms: 169 loops: 2500 ms: 171 但是,对于较大的向量大小,多核的性能是: Elements count: 300.000 Threads: 1 loops: 1000

对于最大为100.000个元素的向量大小,计时与预期完全相同:

Elements count: 100.000

Threads: 1
loops: 10000 ms: 650

Threads: 4
loops: 2500 ms: 168
loops: 2500 ms: 169
loops: 2500 ms: 169
loops: 2500 ms: 171
但是,对于较大的向量大小,多核的性能是:

Elements count: 300.000

Threads: 1
loops: 10000 ms: 1968

Threads: 4
loops: 2500 ms: 3817
loops: 2500 ms: 3864
loops: 2500 ms: 3927
loops: 2500 ms: 4008
我的问题是:

  • 谁能给我解释一下原因吗?这是虚假的分享吗?如果是这样,如果线程不共享任何数据,并且所有内核都有自己的一级/二级缓存和缓存线,那么这怎么可能呢
  • 在多线程中处理独立数据时,是否可能实现(或接近)线性加速效率
  • 编辑:感谢所有的答案,到目前为止。关于你的问题:

    @user2079303:元素仅包含一个双数据成员。sizeof(元素)=8。请参阅以获取完整的源代码

    @bku_drytt:resize()正确。我的意图是在每个线程中创建一个包含elemCount元素的向量(不管它们的初始值如何)

    @豪尔赫·冈萨雷斯·洛伦佐:你使用共享三级缓存是绝对正确的。我执行了另一组测试,仅限单线程:

    Elements count: 50.000
    Threads: 1
    loops: 50000 ms: 1615
    
    Elements count: 200.000 (4 times bigger)
    Threads: 1
    loops: 50000 ms: 1615 (slightly more than 4 time bigger)
    
    Elements count: 800.000 (even 4 times bigger)
    Threads: 1
    loops: 50000 ms: 42181 (MUCH more than 4 time bigger)
    

    通过使用4个线程(需要x4存储,因为每个线程有一个向量)来填充L3共享缓存,因此会导致许多缓存未命中,而在单线程执行中,向量适合它。L1和L2是每个核心,但L3不是。一个公平的比较是,与4线程执行相比,使用x4更大的向量运行单线程执行。

    元素
    有多大?您是否记得在启用优化的情况下编译?您是否有意在构造函数中调用
    resize()
    ,而不是
    reserve()
    ?我猜您正在使用4个线程(需要x4个存储,因为每个线程有一个向量)填充L3共享缓存,从而导致许多缓存未命中,而在单线程执行中,向量适合它。L1和L2是每个核心,但L3不是。一个公平的比较是使用比4个线程执行大4倍的向量来运行单线程执行。您的CPU有6 MB的三级缓存。100k*8字节=0.76MB。乘以4,即3MB。三倍于此(300k元素)的是9MB,这不适合三级缓存。从定义上讲,在带宽有限的情况下获得线性加速是不可能的,但如果你真的在做实际工作,这看起来会有所不同。问题是,您所有的“工作”都很容易被一次缓存未命中所掩盖(并且您将比单线程版本多出10k*4),这实际上取决于您的实际问题和访问模式。没有一种银弹可以适用于每一种访问模式(不过,您可能希望查找缓存无关算法,如果它适合您的算法,那么这些算法非常酷)。如果你真的只是带宽有限,那么任何巧妙的线程游戏都不会改变这一事实。
    Elements count: 50.000
    Threads: 1
    loops: 50000 ms: 1615
    
    Elements count: 200.000 (4 times bigger)
    Threads: 1
    loops: 50000 ms: 1615 (slightly more than 4 time bigger)
    
    Elements count: 800.000 (even 4 times bigger)
    Threads: 1
    loops: 50000 ms: 42181 (MUCH more than 4 time bigger)