【问题标题】:C++ volatile and operator overloading for CUDA application用于 CUDA 应用程序的 C++ volatile 和运算符重载
【发布时间】:2010-09-13 09:14:09
【问题描述】:

我有一个 A 类,我重载了它的 operator=。但是,我需要做这样的事情:

volatile A x;
A y;
x = y;

编译时出现错误

error: no operator "=" matches these operands
       operand types are: volatile A = A

如果我删除了 volatile,它是可编译的。无论如何要在不删除“易失性”的情况下编译这个(并且仍然保持易失性的行为)?


基本上这是一个 CUDA 程序,其中 'x' 是共享内存(所有线程都可以访问和修改它的值)。我希望它是“易失性的”,以避免编译器优化并重用该值而不是访问内存地址。

关于问题的更多信息:一开始 A 只是一个原始类型,例如整数,易失性按预期工作并且不会引起任何问题,现在我希望它是一个自定义类(例如整数 128 位)。我不确定为什么 C++ 在这种情况下会抱怨,但不会抱怨原始数据类型。

提前致谢。

【问题讨论】:

    标签: c++ operator-overloading cuda volatile


    【解决方案1】:

    假设volatile 资格是必需的,您必须向A (A& A::operator=(const A&) volatile) 添加一个可变赋值运算符。

    const_cast<A&>(x) = y 将使其编译,但从技术上讲会导致未定义的行为,并且肯定会删除volatile 提供的保证。

    【讨论】:

    • 谢谢!它被编译。但太糟糕了:(,它给了我同样的非易失性行为
    • @iKid:你对volatile的期望是什么?
    • 我为我的问题添加了解释
    • 除此之外,请仔细考虑您如何实际实现此功能 - volatile 表示目标可以在您编写时由其他人编写,因此请确保设置您的内存栅栏或者什么
    【解决方案2】:

    “易失性在 C++ 线程中用处不大”评论与特定于 CUDA 的问题无关。 CUDA中的warp同步编码需要volatile。

    【讨论】:

      【解决方案3】:

      volatile 在 C++ 线程中用处不大(请参阅 Dave Butenhof 在http://www.lambdacs.com/cpt/FAQ.html#Q56 的解释)。确保您的程序将核心本地缓存中写入的数据刷新到其他程序可以在共享内存中看到更新的程度是不够的,并且考虑到如今几乎每个人的多核,这是一个严重的问题。我建议您使用适当的线程同步方法,例如 boost's 如果您的可移植性需要匹配它,或者可能是 POSIX 互斥锁和条件变量,而不能使用更多依赖于体系结构的技术,例如内存屏障或在内核之间隐式同步内存的原子操作。

      我确定您希望它快速,但快速和不稳定通常不如缓慢和可靠有用,特别是如果您交付的产品仅在客户的硬件上不稳定。

      【讨论】:

      • 特别是考虑到pthread_mutexes 可以非常轻量级
      • 因为每个人都在 POSIX 上运行,amirite?
      • @DeadMG:不,这就是为什么我们有 Boost.Thread 等可移植包装器和 C++0x 线程支持库的原因。
      • 没错。与 boost::thread 相比,直接推荐 POSIX 是不正确的。
      • “易失性在 C++ 中用处不大。”这就像说“const 在 C++ 中用处不大”一样无稽之谈。 volatile 的问题不是volatile,而是那些认为volatile 是一些神奇的线程同步原语被破坏的程序员。不是。
      【解决方案4】:

      声明一个拷贝构造函数

      volatile A& operator=(volatile A&) volatile;
      

      使用 nvcc 为我工作。请注意,您可能必须仅通过引用传递非原始类型。否则,当非原始类型按值传递给非易失性参数时,您将需要更多将易失性实例转换为非易失性的复制构造函数。 它实际上归结为建立 volatile 正确性(很像 const 正确性)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-19
        • 2010-11-27
        • 1970-01-01
        • 2012-11-26
        相关资源
        最近更新 更多