在我的 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]);
}
我正在尝试编写一些 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]);
}