Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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
Performance 英特尔x86 CPU上比较和交换(CAS)的最快方法?_Performance_Assembly_X86_Latency_Cpu Architecture - Fatal编程技术网

Performance 英特尔x86 CPU上比较和交换(CAS)的最快方法?

Performance 英特尔x86 CPU上比较和交换(CAS)的最快方法?,performance,assembly,x86,latency,cpu-architecture,Performance,Assembly,X86,Latency,Cpu Architecture,我需要交换两个8x字节的内存区域,很可能使用CMPXCHG8B。然而,我想尽快做到这一点。其他线程将等待此操作完成。关于这一点,我有几个问题: -仅当我使用多个处理器或多个内核时,才需要锁前缀吗?如果可能的话,我真的想避免使用这个 -如果等待线程希望访问的内存位于不同的缓存线中,我是否能够基于MESI协议“锁定”而不使用lock前缀 我是在单处理器(多核)上运行的,但如果有差异,我最欢迎向多处理器系统解释差异。如果您有多个处理器或多核,并且希望同步安全地访问共享变量,则无法避免锁定。(使用XCH

我需要交换两个8x字节的内存区域,很可能使用
CMPXCHG8B
。然而,我想尽快做到这一点。其他线程将等待此操作完成。关于这一点,我有几个问题:

-仅当我使用多个处理器或多个内核时,才需要
前缀吗?如果可能的话,我真的想避免使用这个

-如果等待线程希望访问的内存位于不同的缓存线中,我是否能够基于MESI协议“锁定”而不使用
lock
前缀


我是在单处理器(多核)上运行的,但如果有差异,我最欢迎向多处理器系统解释差异。

如果您有多个处理器或多核,并且希望同步安全地访问共享变量,则无法避免锁定。(使用XCHG并不能避免锁;它只是隐藏在指令中)

按照Jester的提示,我会尝试将您的两块内存命名为“左”和“右”,并使用标志动态重命名它们,例如

    GetLeft:  if LSB(FLAG)   ; least significant bit
              Read Left
              else Read Right

然后,以下代码将尽快“交换”它们:

    SwapLeftAndRight: 
               LOCK INC FLAG   ; flips LSB of flag
这样就不需要互斥。(如果线程试图更新这些区域,则无论您做什么,都需要互斥锁)


如果访问速度确实很关键,那么他关于将两个连续指针交换到左侧和右侧的提示非常好。

在本次讨论中,“处理器”==“核心”。我认为
CMPXCHG8B
在这种情况下不会对您有多大帮助,因为这只会交换寄存器和内存,而不是两个内存区域。你可以重写你的代码,这样你只需要交换两个连续的指针,或者使用互斥锁;但它们必须是连续的,CPU必须支持
cmpxchg16b
指令(该指令仅在64位代码中受支持,在早期的一些64位CPU上不受支持)。
    SwapLeftAndRight: 
               LOCK INC FLAG   ; flips LSB of flag