Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++ ARM原子性能_C++_Multithreading_Arm_Atomic_Intel - Fatal编程技术网

C++ ARM原子性能

C++ ARM原子性能,c++,multithreading,arm,atomic,intel,C++,Multithreading,Arm,Atomic,Intel,我在Intel CPU和ARM CPU(Mac/iOS,编译器:Clang)上运行相同的代码。通过分析应用程序,我注意到,在iOS/ARM上,原子操作是前3项,而在Intel上,它们甚至不在前10项。这是真的吗,在ARM上的原子操作要慢得多?(当然相对而言)需要注意的一点是,由于实现细节的原因,您不一定能看到整个过程 在ARM的加载链接/存储条件范例下,任何原子操作都至少有4条指令-加载独占、1、存储独占、条件分支,以便在必要时重试。其他核心完全不知道这一点,继续做自己的事情 然而,在x86上,

我在Intel CPU和ARM CPU(Mac/iOS,编译器:Clang)上运行相同的代码。通过分析应用程序,我注意到,在iOS/ARM上,原子操作是前3项,而在Intel上,它们甚至不在前10项。这是真的吗,在ARM上的原子操作要慢得多?(当然相对而言)

需要注意的一点是,由于实现细节的原因,您不一定能看到整个过程

在ARM的加载链接/存储条件范例下,任何原子操作都至少有4条指令-加载独占、1、存储独占、条件分支,以便在必要时重试。其他核心完全不知道这一点,继续做自己的事情

然而,在x86上,指令可以直接在内存上操作,原子通常通过在单个指令上粘贴锁定前缀来实现。这意味着两件事:首先,你永远不能在你的原子“例程”中被打断,因为它是一条指令。其次,当总线被锁定时,没有其他内核可以访问内存,因此它有效地暂停所有操作的执行,直到完成2。总之,这意味着采样分析器很少(如果有的话)捕捉到“正在进行中”的原子操作,不管它实际需要多长时间

(1)OK,这样原子交换只需要3个指令,但是在这里中间的任何其他指令都有一个或多个指令。


[2] 现代内核的情况稍逊于此,它们只锁定自己的缓存,而不是所有缓存,以避免影响其他访问无关区域的内核,但硬件缓存的一致性仍将防止任何其他人的干扰。

Herb Sutter的“原子武器”会谈中说,ARM7和PowerPC是C++具有这样一组可删除的内存排序选项的原因:在这些架构上,顺序一致性非常昂贵,并且您需要使用轻松排序来获得合理的性能。这是非常有用的。虽然赫伯·萨特的演讲很有趣,很有启发性,但它可能并没有真正解决这个问题。为了更好地理解,你应该提供一些代码和分解。比较苹果和橙子只会让你走到这一步。根据基准测试,ARM系统的速度将大大加快,同样,intel系统的速度也将大大加快。两者都很容易演示。原子操作是前三项。我们需要看看代码。原子能意味着很多事情。我猜你是从C++ x11中讨论Clang C++原子。对于x86,CLAN/BSD是优化的,是为X86优化的C++标准,还是X86更好的无锁CPU。我猜是工具或你的代码出了问题。我们不知道该工具的版本,甚至没有您的代码。但是在x86上,指令比arm指令长得多(使用mem操作数时),满足于未对齐的传输,等等,都是微代码,等等。体系结构是不同的,因此,您永远不会期望每一行高级代码在体系结构和平台上执行相同的操作,就这么简单。此外,如果花在原子例程上的时间过多是由于多线程中的大量STREX故障,那么很值得研究争用的原因。数据布局在这里很重要-尝试在同一排他保留颗粒(通常==缓存线)中的两个变量上同时使用原子可能会严重影响性能。不幸的是,我认为内存锁定不会是问题,因为我的应用程序运行在单个线程上。原子是从互斥体调用的,在我的例子中,互斥体不是必需的,但它们存在于库中,因为它是线程安全实现的。显然,我可以简单地删除这些互斥体并重新编译库,但我很好奇是什么导致了性能瓶颈。