在我的 C++ 生成器应用程序中包含 xmmintrin.h 的问题

Problem including xmmintrin.h in my c++ builder application

我正在尝试编写一些 SIMD 代码(在 C++Builder 10.1 Berlin 中),但我在 mmintrin.h 中遇到 E2257 错误(包含在 xmmintrin.h,它应该包含在 SIMD 的东西中)。有一堆相同的错误,所以 bcc32 似乎无法处理 headers.

中的语法

例如,所有包含 __atribute__ 的行似乎都会导致此错误:

typedef long long __m64 __attribute__((__vector_size__(8)));

对我来说,这确实像是一个 C++builder 错误,但我不确定,老实说我不熟悉 __atribute__(这似乎不是C++ 关键字,所以我假设它是 function/macro 或语言扩展)。

更新:由于 C++ Builder 10.1 Berlin 可以使用 Clang(bcc32c 而不是旧的编译器 bcc32),我也试过了,这有助于删除所有 E2257错误。不幸的是,我现在遇到了一个 ICE([bcc32c Error] FillObj.cpp(1): ICE: Internal compiler error: C0000005 @ 27287E3D )。罪魁祸首是这一行 _mm_storeu_ps(&a[i], xmm0 ); 注释掉这一行会使代码编译通过。此代码只是一个示例,但足以重现问题。

#include <xmmintrin.h>

void SumValues(float * a, float * b, unsigned len){

    __m128 xmm0, xmm1;
    //for this simple example , it's assumed len is divisible by     
    for(int i=0; i<len; i += 4){

      xmm0 = _mm_loadu_ps( &a[i] );
      xmm1 = _mm_loadu_ps( &b[i] );

      xmm0 = _mm_add_ps(xmm0, xmm1);

      _mm_storeu_ps( &a[i], xmm0 );//this line is causing the ICE described above

    }
}

正如我在评论中所说,这在 Qt 中运行良好(使用 MinGw 5.5.0)。关于 Clang 编译器,我不确定它是哪个版本,但由于它必须支持所有 VCL 东西,我认为它不是标准的 clang 编译器。

我在 IDE 中使用了 10.4 Sydney 64 位 Windows C++ 编译器,您的示例为我编译和执行。

void SumValues(float * a, float * b, unsigned len){
    __m128 xmm0, xmm1;
    //for this simple example , it's assumed len is divisible by
    for(int i=0; i<len; i += 4){

      xmm0 = _mm_loadu_ps( &a[i] );
      xmm1 = _mm_loadu_ps( &b[i] );
      xmm0 = _mm_add_ps(xmm0, xmm1);
      _mm_storeu_ps( &a[i], xmm0 );//this line is causing the ICE described above
    }
}

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    //
    float myA[4],myB[4];
    myA[0] = 0.0;
    myA[1] = 1.0;
    myA[2] = 2.0;
    myA[3] = 3.0;
    myB[0] = 0.0;
    myB[1] = 1.0;
    myB[2] = 2.0;
    myB[3] = 3.0;
    SumValues(myA,myB,4);
    Button1->Caption = FloatToStr(myA[2]);
}