加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C独立数据的多线程性能

发布时间:2020-12-16 06:50:36 所属栏目:百科 来源:网络整理
导读:让我们有一个非常简单的C类,只有一个数据成员: class Container {public: std::vectorElement elements; Container(int elemCount);}; 现在创建N个线程,执行一个非常简单的任务: 创建具有特定矢量大小的本地Container 遍历向量并简单地递增每个元素的val
让我们有一个非常简单的C类,只有一个数据成员:

class Container {
public:
    std::vector<Element> elements;
    Container(int elemCount);
};

现在创建N个线程,执行一个非常简单的任务:

>创建具有特定矢量大小的本地Container
>遍历向量并简单地递增每个元素的val
>重复步骤2 10.000次(以秒为单位获取时间而不是ms)

完整的代码清单可以在Pastebin找到

根据CoreInfo我的CPU(英特尔酷睿i5 2400)有4个内核,每个内核都有自己的L1 / L2缓存:

Logical to Physical Processor Map:
*---  Physical Processor 0
-*--  Physical Processor 1
--*-  Physical Processor 2

Logical Processor to Cache Map:
*---  Data Cache          0,Level 1,32 KB,Assoc   8,LineSize  64
*---  Instruction Cache   0,LineSize  64
*---  Unified Cache       0,Level 2,256 KB,LineSize  64
-*--  Data Cache          1,LineSize  64
-*--  Instruction Cache   1,LineSize  64
-*--  Unified Cache       1,LineSize  64
--*-  Data Cache          2,LineSize  64
--*-  Instruction Cache   2,LineSize  64
--*-  Unified Cache       2,LineSize  64
---*  Data Cache          3,LineSize  64
---*  Instruction Cache   3,LineSize  64
---*  Unified Cache       3,LineSize  64
****  Unified Cache       4,Level 3,6 MB,Assoc  12,LineSize  64
---*  Physical Processor 3

对于最大为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

我的问题:

>有人可以向我解释这个原因吗?这是假共享吗?如果是这样,如果线程不共享任何数据并且所有内核都有自己的L1 / L2缓存和缓存行,那么这怎么可能?
>在多线程中处理独立数据时,是否有可能实现(或接近)线性加速效率?

编辑:感谢所有答案,到目前为止.关于你的问题:

@ user2079303:元素只包含一个双数据成员.的sizeof(元件)= 8.有关完整的源代码,请参阅Pastebin.

@bku_drytt:resize()是正确的.我的目的是在每个线程中创建一个包含elemCount元素的向量(无论它们的初始值如何).

@JorgeGonzálezLorenzo:你对共享的L3缓存绝对正确.我执行了另一组测试,仅限单线程:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读