我认为 C++ 还没有涵盖任何类型的事务内存,但 TSX 仍然可以以某种方式将“好像规则”用于由 C++ 内存模型管理的东西。
那么,成功的 HLE 操作或成功的 RTM 事务会发生什么?
说“存在数据竞争,但没关系”并没有多大帮助,因为它没有阐明“正常”的含义。
使用 HLE 可能可以将其视为“前一个操作发生在后续操作之前。好像该部分仍然由被省略的锁保护”。
RTM 是什么?由于甚至没有省略锁,只有(可能是非原子的)内存操作,可能是加载、存储、两者或无操作。什么与什么同步?在什么之前会发生什么?
由于 Spectre 缓解,所有当前 CPU 都禁用了硬件锁定省略是否正确,并且任何尝试使用 HLE 内在函数/指令进行互斥都会导致通常的互斥?
这是否有可能在未来不会有类似 HLE 互斥体的东西来避免像 Spectre 这样的漏洞?
通过 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) 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) 我想利用 Intel TSX 来编写无锁代码。
xbegin
my_inst1
my_inst2
xend
Run Code Online (Sandbox Code Playgroud)
但是,由于某些原因,我在 TSX 执行 TSX 中的一条指令中止。
我想知道哪条指令产生了错误并使 TSX 中止。
有没有办法知道哪个指令产生了错误?
我的第一次尝试是在 TSX 区域中执行每条指令后增加全局计数器。但是,当故障发生时,对计数器的更新也会回滚,因为它会回滚 TSX 区域中的每次写入。
有什么技巧可以调试 TSX 执行吗?
我有一个在 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