Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Linked List_Profiling_Lock Free - Fatal编程技术网

C 无锁链接列表的性能比锁定的对应列表差

C 无锁链接列表的性能比锁定的对应列表差,c,multithreading,linked-list,profiling,lock-free,C,Multithreading,Linked List,Profiling,Lock Free,我试图比较锁定和无锁定链表数据结构的性能。我已经实现了无锁链表的算法。这两个程序都是用C语言实现的 我正在测试4个线程。每个线程有1000个插入操作 我使用Intel PCM工具来测量性能 以下是我的发现: 无锁: Median of L3 Misses=1012699 Median of L2 Misses=1479741 Median of L3 Hits=484128 Median of L2 Hits=1797537 Median of Time=1.80696 Median of Cy

我试图比较锁定和无锁定链表数据结构的性能。我已经实现了无锁链表的算法。这两个程序都是用C语言实现的

我正在测试4个线程。每个线程有1000个插入操作

我使用Intel PCM工具来测量性能

以下是我的发现: 无锁:

Median of L3 Misses=1012699
Median of L2 Misses=1479741
Median of L3 Hits=484128
Median of L2 Hits=1797537
Median of Time=1.80696
Median of Cycles=5296042019
Median of IPC=1.536135
Median of Bytes Read=444423232
Median of Bytes Written=25414144 
锁定:

Median of L3 Misses=711796.5
Median of L2 Misses=1517899
Median of L3 Hits=819408.5
Median of L2 Hits=2282527
Median of Time=0.244517
Median of Cycles=894265192
Median of IPC=0.8495695
Median of Bytes Read=174872576
Median of Bytes Written=24722912
锁定版本在除IPC之外的所有计数上都表现得更好。这是应该发生的吗?还是无锁数据结构应该表现得更好

如果是,那么使用无锁数据结构的好处是什么? 任何帮助都将不胜感激

锁定版本在除IPC之外的所有计数上都表现得更好。这是应该发生的吗?还是无锁数据结构应该表现得更好

一般来说,哪个性能更好是工作负载细节和实现细节共同作用的结果。你提到的那篇论文说

无锁数据结构也有潜力获得更好的性能

(重点补充),但它并不能保证在每种情况下都有更好的表现。尽管多个线程可以同时修改无锁数据结构,但每次修改都会涉及更多操作,即使没有冲突。当存在冲突时,性能会下降

我还观察到,与锁定代码相比,无锁代码的缓存未命中比例更高。尽管我不能自信地解释这一点,但我至少可以想到两个看似合理的原因,为什么这将是无锁实现的预期结果。自然,缓存使用效率较低会显著降低性能

如果是,那么使用无锁数据结构的好处是什么

该文件说,主要的好处是:

如果实现是无锁的,则单个进程的延迟或故障不会阻止系统中其他进程的进程


转到此页面:在该页面上有一个youtube视频链接,链接到CppCon上关于无锁实现和权衡的演讲。视频分为两部分,链接是第2部分的。那么,找到第1部分。视频总共约2小时,但演讲者很有娱乐性,并且非常了解自己的作品。这可能解释了性能问题(争论)。无锁数据结构可能有助于避免昂贵的上下文切换。您没有看到真正的问题。缓存命中率非常糟糕,这是现代处理器上传统链表的标准问题。这些旧报纸忽略了一个非常重要的细节。不要用它们。谢谢你的回答。有没有关于如何减少缓存未命中的帮助?@Sumant,缓存命中率主要是数据访问模式的函数,而数据访问模式本身就是工作负载和实现细节的函数,就像总体性能一样。在可能的情况下,您更愿意在内存中进行线性扫描,避免跳转。一种方法是在中等规模的组中分配列表节点,而不是一次分配一个。布置结构成员以尽量减少填充也可能会有所帮助。但是,总的来说,您不太可能用这些技巧来弥补两种方法之间观察到的性能差异。如果性能是您的首要任务,那么请使用模拟预期工作负载的工作负载测试每种方法,并选择性能更好的方法。我的目标是从无锁链表中挤出大部分性能。我正在为每个插入操作分配节点的空间。关于如何优化代码有什么建议吗?让我知道是否有代码链接。@Sumant,如果这是一个研究生项目,那么最好与你的研究生导师讨论优化问题。此外,如果您的代码工作,如情况一样,那么您可以考虑将其张贴在AT上进行审查。然而,如果你选择这样做,那么一定要仔细阅读并遵守他们的规则,这与我们现在的规则有点不同。