SSE HADDPS 错误:'__m256'不命名类型?

SSE HADDPS error: '__m256' does not name a type?

本文关键字:类型 m256 错误 SSE HADDPS      更新时间:2023-10-16

我正在尝试使HADDPS指令工作,但我似乎无法在这段代码中声明__256

#include <xmmintrin.h>
#include <emmintrin.h>
#include <pmmintrin.h>
#include <stdio.h>
#include <stdint.h>
#include <iostream>
__m256 HADDPS(__m256 __X, __m256 __Y)
{
    return _mm256_hadd_ps (__X, __Y);
}
int main()
{
    //horizontal add packed single-------------------------------------------------
    __m256 HADDPSA = _mm_set_ps(4.0f, 3.0f, 2.0f, 1.0f);
    __m256 HADDPSB = _mm_set_ps(4.0f, 3.0f, 2.0f, 1.0f);
    __m256 HADDPSR = HADDPS(HADDPSA, HADDPSB);
    return 0;
}

我在-msse -msse2 -msse3 -msse4中使用g++。

这就是错误。

HADDPS.cpp|8|error: '__m256' does not name a type|
HADDPS.cpp||In function 'int main()':|
HADDPS.cpp|15|error: '__m256' was not declared in this scope|
HADDPS.cpp|15|error: expected ';' before 'HADDPSA'|
HADDPS.cpp|16|error: expected ';' before 'HADDPSB'|
HADDPS.cpp|17|error: expected ';' before 'HADDPSR'|

这里有一点混乱,这是从您拥有的多个包含开始的。

首先,你的代码不是干净的C,也不是干净的C++,它的混合只会让你头疼,因为你没有从中得到任何好处。

如果你真的想用C++编码,你应该添加一些extern "C"并删除所涉及的C headers,如果你喜欢C,我建议删除#include <iostream>并使用gcc而不是g++

您还同时包含了多个SSE集的头,请参阅本文以获得更干净的方法。

最后,这是一个程序的源代码,该程序试图模仿您可能正在寻找的的业务逻辑

#include <pmmintrin.h>
#include <immintrin.h>
__m128 HADDPS(__m128 __X, __m128 __Y)
{
  return _mm_hadd_ps (__X, __Y);
}
int main()
{
  __m128 HADDPSA = _mm_set_ps(4.0f, 3.0f, 2.0f, 1.0f);
  __m128 HADDPSB = _mm_set_ps(4.0f, 3.0f, 2.0f, 1.0f);
  __m128 HADDPSR = HADDPS(HADDPSA, HADDPSB);
  return 0;
}

你应该用编译这个

gcc -msse3 main.c

下面是一个使用原始问题的__m256数据类型的示例。使用gcc或g++4.8.1或VS2012进行无错误编译。

// gcc compile command line: gcc -mavx sample.c
// g++ compile command line: g++ -mavx sample.c
// VS2012 compile command line: cl sample.c
#include <intrin.h>
__m256 HADDPS(__m256 __X, __m256 __Y)
{
    return _mm256_hadd_ps (__X, __Y);
}
int main()
{
    //horizontal add packed single-------------------------------------------------
    __m256 HADDPSA = _mm256_set_ps(4.0f, 3.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f);
    __m256 HADDPSB = _mm256_set_ps(4.0f, 3.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f);
    __m256 HADDPSR = HADDPS(HADDPSA, HADDPSB);
    return 0;
}