C独立数据的多线程性能
让我们有一个非常简单的C类,只有一个数据成员:
class Container { public: std::vector<Element> elements; Container(int elemCount); }; 现在创建N个线程,执行一个非常简单的任务: >创建具有特定矢量大小的本地Container 完整的代码清单可以在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个线程执行相比运行单线程执行.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |