问题标签 [transactional-memory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
debugging - TSX:获取导致中止的地址
从另一个问题来看,显然英特尔 TSX 读/写集是隐藏的。这是可以理解的,特别是因为它允许他们搞砸设计和实现,并可能尝试诸如布隆过滤器之类的东西。
但是当一个事务中止时,最好看看是什么地址或缓存行导致它(当这样的事情是中止的原因时)。地址是否暴露在任何地方?
c++ - 什么是事务性内存以及它在 C++ 编程中会发生什么变化 (C++20)
C++20 的一项提议特性是事务性内存。
它是什么?它会简化 C++ 中的多线程编程吗?
stm - 将“ref dataType”参数转换为 Chapel 中的“ptr(dataType)”
是否有官方方法可以将通过引用传递的参数转换为指向完全相同类型的指针?我知道在编译的 CodeGen 阶段会ref int
变成int *
,并且我知道您可以使用extern来实现 C 互操作性,但是为了编写 Chapel 抽象又如何呢?此外,宽引用和宽指针的情况如何?你会如何处理这样的事情。
对于那些好奇的人,我正在尝试一些 PGAS-STM(分区全局地址空间 - 软件事务内存),我需要做的一件事是允许语义如下......
使用 STM 在列表前添加:
是的,它目前很丑,但它是一个非常早期的原型。
编辑:更改命名STMBegin
为begin
webassembly - 将 TSX 与 WebAssembly 一起使用
可以将 TSX 事务同步扩展与 WebAssembly 一起使用吗?我没有发现任何关于在 WebAssembly 中使用这些扩展的信息。谢谢!
performance - 有没有一种方法可以在 x86 中并行测量多个负载的延迟(使用 RDTSCP 或 RDTSC),而无需序列化?
我正在尝试测量在乱序处理器中并行执行的多个内存访问的延迟。
问题是任何测量负载延迟的尝试都将其相对于其他负载序列化。
以一个简单编写的代码为例,它测量两个负载的延迟:
在上面的代码中,根据我的测试,Intel x86 中rdtscp的ordering 属性序列化了load-1 和load-2 的执行(即load-2 仅在load-1 完成执行后才发布到内存系统)。结果,上面的代码没有利用可用的内存带宽。理想情况下,我想确保负载的最大吞吐量,同时独立测量每个负载的延迟。
有没有办法测量 load-1 和 load-2 的延迟,同时允许它们并行执行?
理想情况下,我需要的是一种 rdtscp 形式,它根据正在测量延迟的负载进行排序,而不是使用任何其他指令明确排序。我想知道是否有办法使用rdtscp或rdtsc来获得它。
c++ - STM(软件事务内存)C++ 最先进的技术
我对 C++ 中 STM(软件事务内存)的最新技术有疑问。我在 cppreference 网站(transactional_memory)上读到这是一个实验性功能,但它也说该页面正在建设中,所以我的问题是:
标准现在是否支持此功能?(例如 c++17 或 c++20)
如果还没有,cppreference 页面会显示:
GCC 从 6.1 版开始支持此技术规范(需要 -fgnu-tm 才能启用)。自 4.7 起,GCC 支持此规范的旧变体。
较新的 GCC 版本是否也支持此功能?
c++ - C++ 同步和原子软件事务内存
我阅读了关于事务内存的实验特性的cppreference指南,并尝试了它。
我写了一些简单的代码sincronized
,说 cpp 引用不是事务,但只保证块中的操作按总顺序执行,我用 and 编写相同的代码,atomic_noexcept
而atomic_commit
不是atomic_cancel
似乎尚未实现。
我的疑问是关于和之间的区别atomic_noexcept
,显然它们以相同的方式工作,除了在原子块中调用无事务安全函数时会出现编译错误。atomic_commit
synchronized
因此,我分析了 3 个变体的汇编代码,结果相同,如下所示:
cpp atomic_noexcept:
程序集 atomic_noexcept:
cpp atomic_commit:
程序集 atomic_commit:
cpp 同步:
组装同步:
他们如何以不同的方式工作?例如,我报告了 cppreference 的不同原子块的解释:
atomic_noexcept :如果抛出异常,则调用 std::abort
atomic_cancel:如果抛出异常,则调用 std::abort ,除非异常是用于事务取消的异常之一(见下文),在这种情况下事务被取消:程序中所有内存位置的值被原子块操作的副作用修改的值恢复到它们在原子块开始执行时的值,并且异常继续像往常一样展开堆栈。
atomic_commit:如果抛出异常,则事务正常提交。
如果具有相同的汇编代码,atomic_noexcept
工作方式有何不同?atomic_commit
如果具有相同的汇编代码,同步块与原子块的工作方式有何不同?
编辑:
所有这些测试和汇编代码都是从最新版本的 GCC (V. 10.2) 中提取的
编辑2:
经过一些测试和研究,我还没有找到对上述不同行为的合乎逻辑的解释。
concurrency - 我对如下所述的事务内存的理解是否正确?
我正在尝试理解 TM。我在这里阅读了本的回答,并试图了解互联网上的其他一些文章。我仍然不太确定我是否理解正确。在我对事务内存的理解中,线程可以并行执行事务。如果两个(或更多)线程尝试访问同一个事务变量,则除一个之外的所有线程都将中止事务并重新开始(在某些时候,不一定立即)。不中止的更新事务变量。
因此,简而言之,在 TM 中,所有线程都并行运行,我们希望不会有任何对事务变量的访问重叠,如果有,我们只让一个线程继续,而其他线程回滚并重试。这种对TM的理解正确吗?
c - 受限事务内存/HTM 是如何详细工作的?
我正在学习硬件事务内存(HTM),但它的详细实现是有限的。我知道 HTM 中的事务缓冲其在 L1cache 中的读/写集,并通过缓存一致性协议检测冲突。我学到的使用HTM的程序案例如下。
所以,我很困惑当“(*a)++”和“(*b)++”之间发生冲突时会发生什么。说,T0增加a,而T1读a。缓存协议将检测到冲突并中止 T0。但是T0会发生什么?它会继续运行其余代码,即 (*b)++ 和 _xend() 吗?我认为它不会继续运行,而是会重试。但是它怎么知道循环的起点在哪里呢?这个具体怎么实现的?