标签: intel-tsx

如何将 Intel TSX 与 C++ 内存模型一起使用?

我认为 C++ 还没有涵盖任何类型的事务内存,但 TSX 仍然可以以某种方式将“好像规则”用于由 C++ 内存模型管理的东西。

那么,成功的 HLE 操作或成功的 RTM 事务会发生什么?

说“存在数据竞争,但没关系”并没有多大帮助,因为它没有阐明“正常”的含义。

使用 HLE 可能可以将其视为“前一个操作发生在后续操作之前。好像该部分仍然由被省略的锁保护”。

RTM 是什么?由于甚至没有省略锁,只有(可能是非原子的)内存操作,可能是加载、存储、两者或无操作。什么与什么同步?在什么之前会发生什么?

c++ memory-model language-lawyer intel-tsx

7
推荐指数
1
解决办法
599
查看次数

由于 Spectre Mitigation,Hardware Lock Elision 是否已经一去不复返了?

由于 Spectre 缓解,所有当前 CPU 都禁用了硬件锁定省略是否正确,并且任何尝试使用 HLE 内在函数/指令进行互斥都会导致通常的互斥?

这是否有可能在未来不会有类似 HLE 互斥体的东西来避免像 Spectre 这样的漏洞?

security x86 x86-64 speculative-execution intel-tsx

6
推荐指数
1
解决办法
398
查看次数

硬件事务内存:_xbegin() 返回 0

通过 gcc 文档:x86-transactional-memory-intrinsics.html,当事务失败/中止时,_xbegin()应返回abort status。但是,我发现它有时返回 0。而且出现的频率非常高。什么情况下**_xbegin()**会返回0?

\n\n

查看手册后,我发现很多情况都可能导致这种结果。例如,CPUID、SYSTEMCALL、CFLUSH.等。但是,我不认为我的代码触发了其中任何一个。

\n\n

这是我的代码: 模拟一家小银行,随机帐户将 1 美元转账到另一个帐户。

\n\n
#include "immintrin.h"\n#include <thread>\n#include <unistd.h>\n#include <iostream>\n\nusing namespace std;\n\n#define n_threads 1\n#define OPSIZE 1000000000\ntypedef struct Account{\n    long balance;\n    long number;\n} __attribute__((aligned(64))) account_t;\n\ntypedef struct Bank{\n    account_t* accounts;\n    long size;\n} bank_t;\n\nbool done = 0;\nlong *tx, *_abort, *capacity, *debug, *failed, *conflict, *zero;\n\nvoid* f1(bank_t* bank, int id){\n    for(int i=0; i<OPSIZE; i++){ \n        int src = rand()%bank->size;\n        int dst = rand()%bank->size;\n        while(src == dst){\n            dst = rand()%bank->size;\n        } …
Run Code Online (Sandbox Code Playgroud)

c++ x86 transactional-memory intel-tsx

5
推荐指数
1
解决办法
2161
查看次数

了解 ARM 事务内存扩展

ARM 事务内存扩展对如何使用它们有相当简单的描述:

sem_post:
    TSTART X0         // Start of outer transaction
    CBNZ   test_fail  // No reason for this routine to cancel or fail
    LDR    X1, [X2]   // X2 points to semaphore
    ADD    X1, X1, #1 // Increment semaphore value
    STR    X1, [X2].  // Store incremented value
    TCOMMIT           // Commit transaction and exit
Run Code Online (Sandbox Code Playgroud)

我想要弄清楚的是,这些事务是否基于与代码其他部分中的事务的冲突而重放,以及它们是否基于与任何类型的访问的冲突而重放。为了详细说明,假设我们有这个例程:

sem_wait:
    TSTART X0          // Start of outer transaction
    CBNZ   retry_check // This routine checks for retry (RTRY) and restarts transaction
    LDR    X1, [X2]   // X2 points to semaphore …
Run Code Online (Sandbox Code Playgroud)

arm transactional-memory memory-model arm64 intel-tsx

5
推荐指数
1
解决办法
368
查看次数

是否可以调试英特尔 TSX?

我想利用 Intel TSX 来编写无锁代码。

xbegin
my_inst1
my_inst2
xend
Run Code Online (Sandbox Code Playgroud)

但是,由于某些原因,我在 TSX 执行 TSX 中的一条指令中止。

我想知道哪条指令产生了错误并使 TSX 中止。

有没有办法知道哪个指令产生了错误?

我的第一次尝试是在 TSX 区域中执行每条指令后增加全局计数器。但是,当故障发生时,对计数器的更新也会回滚,因为它会回滚 TSX 区域中的每次写入。

有什么技巧可以调试 TSX 执行吗?

debugging x86 assembly intel intel-tsx

4
推荐指数
1
解决办法
179
查看次数

英特尔 TSX 前缀是否作为 NOP 在 AMD 上(安全)执行?

我有一个在 Intel 和 AMD x86 机器上运行的应用程序的 MASM 同步代码。

我想使用 Intel TSX 前缀来增强它,特别是 XACQUIRE 和 XRELEASE。

如果我为 Intel 正确修改了我的代码,当我尝试在 AMD 机器上运行它时会发生什么?英特尔表示,它们被设计为向后兼容,这大概意味着它们在没有 TSX 的英特尔 CPU 上什么都不做。

我知道 AMD 还没有实施 TSX。但是这些前缀在 AMD CPU 上运行是否安全?这种行为是否记录在 AMD 手册中的某处,还是假设这是安全的并且永远是安全的?

x86 assembly backwards-compatibility amd-processor intel-tsx

4
推荐指数
1
解决办法
699
查看次数