【问题标题】:Overloading conflict with vector types __m128, __m256 in GCC与 GCC 中的向量类型 __m128、__m256 重载冲突
【发布时间】:2011-08-21 00:56:51
【问题描述】:

我已经开始在新的英特尔 Sandy Bridge 处理器上使用 AVX 指令。我正在使用 GCC 4.5.2,TDM-GCC 64 位版本的 MinGW64。

我想重载 operator__m256、__m128 等打印到控制台。但是我遇到了超载冲突。以下代码中的第二个函数产生错误“与先前的声明 void f(__vector(8) float) 冲突”:

void f(__m128 v) {
cout << 4;
}

void f(__m256 v) {
    cout << 8;
}

似乎编译器无法区分这两种类型并认为它们都是f(float __vector)

有没有办法解决这个问题?我一直无法在网上找到任何东西。非常感谢任何帮助。

【问题讨论】:

    标签: gcc operator-overloading sse avx mingw-w64


    【解决方案1】:

    我对通过更改编译器 ABI 标志来解决此问题的解决方案不满意,因此我开始寻找不同的解决方案。似乎他们在编写 Eigen 库时遇到了这个问题 - 有关详细信息,请参阅此源文件http://eigen.tuxfamily.org/dox-devel/SSE_2PacketMath_8h_source.html

    我的解决方案是对他们的稍作调整:

    template <typename T, unsigned RegisterSize>
    struct Register
    {
        using ValueType = T;
        enum { Size = RegisterSize };
    
        inline operator T&() { return myValue; }
        inline operator const T&() const { return myValue; }
        inline Register() {}
        inline Register(const T & v) : myValue(v) {} // Not explicit
        inline Register & operator=(const T & v)
        {
            myValue = v;
            return *this;
        }
    
        T myValue;
    };
    
    using Register4 = Register<__m128, 4u>;
    using Register8 = Register<__m256, 8u>;
    // Could provide more declarations for __m128d, __m128i, etc. if needed
    

    使用上述方法,您可以重载Register4Register8 等,或者生成采用Registers 的模板函数,而不会遇到链接问题且无需更改 ABI 设置。

    【讨论】:

      【解决方案2】:

      在函数模板遇到类似问题时,我不小心偶然发现了答案。在这种情况下,GCC 错误信息实际上提出了一个解决方案:

      添加-fabi-version=4编译器选项。

      这解决了我的问题,希望在链接标准库时不会引起任何问题。

      您可以在ABI Policy and GuidelinesABI specification 阅读有关 ABI(应用程序二进制接口)和 GCC 的更多信息。 ABI 指定当代码被编译成目标文件时函数名称是如何被修改的。显然,GCC 默认使用的 ABI 版本 3 无法区分各种向量类型。

      【讨论】:

      • 请注意,从 gcc-5 开始,这不再需要,因为默认的 -fabi-version 已更改。
      • 这是解决 GCC 在 Windows 64 位上使用 AVX / AVX2 代码的问题吗?
      猜你喜欢
      • 2012-10-22
      • 2019-10-30
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多