【问题标题】:run time detection of processor type - atomic operations处理器类型的运行时检测 - 原子操作
【发布时间】:2009-10-23 09:35:31
【问题描述】:

我正在实现一些速度关键的多线程代码。如果我确定一些基本的写操作是原子的,我可以避免出现一些关键部分。我刚刚阅读了一篇学术论文,其中我看到了以下内容:

"基本类型大小t、int、float和pointer的写入必须是原子的。一个线程的写入必须以相同的顺序被其他线程看到。IA-32和Intel-64 CPU架构,使用的在大多数现代标准计算机中,保证这些假设。”

我想做的是能够在运行时检测处理器是否属于这些操作是原子的类型。 - 我希望这也适用于 AMD 处理器。

【问题讨论】:

  • AMD 处理器支持 IA32 CPU 架构,他们定义了 AMD64 架构,Intel64 就是从这些架构中派生出来的。
  • 有趣。想知道那是什么论文,以及在存在编译器优化的情况下您希望如何保证。如果你在谈论组装很好,我相信这一点。否则我觉得很难下咽。
  • 这是论文:www.cs.ualberta.ca/~mmueller/ps/enzenberger-mueller-acg12.pdf 我不知道你的意思是“你想如何保证在场编译器优化”..谁说我想要?

标签: c++ multithreading visual-c++ visual-c++-2008


【解决方案1】:

这听起来多余。 .EXE 可以简单地是int main() { return true; }。要么它运行,并且答案是正确的,要么操作系统根本无法运行 .EXE,因为处理器类型与 .EXE 类型不匹配。

【讨论】:

  • 但是我可以制作两个不同的版本——一个带有关键部分的慢版本和一个没有关键部分的快版本。我想在快速测试中包含一个测试,以便能够优雅地退出而不是崩溃或产生错误的答案。
  • 不需要。只需使用InterlockedIncrementAcquire,它在任何地方都使用最快的算法。即使在 Itanic 上。
  • InterlockedIncrementAcquire 是 Win32 特定的。
  • 不,不是。 Win32、Win64-x64 和 Win64-IPF。另请参阅对InterlockedIncrement 的评论。虽然它是特定于 Windows 的,但请查看标签:Visual C++。
【解决方案2】:

我知道这不是主题,但如果你打算编写无锁代码,你应该首先阅读 Herb Sutter 的 Lock-Free Code: A False Sense of Security

引用文章:

无锁码有两大 缺点。首先,范围不广 可用于解决典型的 问题——大量基础数据 结构,甚至是双向链表, 仍然没有已知的无锁 实施。想出一个新的 或改进的无锁数据结构 仍然会为您赢得至少一个 在参考期刊上发表论文, 有时还有学位。

【讨论】:

    【解决方案3】:

    为避免陷入这些 CPU/平台特定问题,您可以考虑:

    等待 c++0x 标准中的 std::atomic(已可用于 GCC)

    使用Intel TBB

    使用ACE_Atomic_Op

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多