2013-07-07 1 views
3

Я пытаюсь получить инструкцию HADDPS, и я не могу объявить __256 в этом коде.Ошибка SSE HADDPS: '__m256' не называет тип?

#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; 
} 

Я использую g ++ с -msse -msse2 -msse3 -msse4.

Это ошибка.

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'| 
+0

Это работает, если вы добавите '-mavx'? –

+0

Ну его ошибка компилятора, поэтому я бы не ожидал, что '-mavx' будет делать многое в любом случае, но я не пытался связываться с этим флагом и теми же ошибками. Я думаю, что упоминание '-msse -msse2 -msse3 -msse4' также было бессмысленным. – pandoragami

+0

Нет, не пытайтесь связываться с ним, попробуйте скомпилировать его. –

ответ

2

У вас здесь немного беспорядка, который начинается прямо с нескольких включений, которые у вас есть.

Сначала ваш код не является чистым C, и это тоже не чисто C++, это смесь, которая может только дать вам головную боль, потому что вы не получаете никакой пользы от этого.

В случае, если вы действительно хотите, чтобы код в C++ вы должны добавить extern "C" и удалить C headers участие, если вы предпочитаете C Я предлагаю, чтобы удалить, что #include <iostream> и использовать gcc вместо g++.

Вы также включаете заголовки для множества SSE-наборов одновременно, см. this post для более чистого подхода.

В конце концов, это исходный код программы, которая пытается имитировать бизнес-логику, вы, вероятно, ищете

#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 
+0

Отлично работает! Благодарю. Я попробую это с помощью extern C в программе на C++. – pandoragami

1

Здесь есть пример, который использует тип данных __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; 
} 
+0

Не '#include ' вещь Microsoft?Я пробовал использовать этот заголовок с GCC, и его нигде не было найдено. – pandoragami

+0

@ user2555139 вы должны изменить включение в 'x86intrin.h' или' immintrin.h', но помните, что инструкции AVX гораздо менее популярны, чем инструкции SSE. – user2485710

+0

Мой тест gcc был выполнен с использованием Windows + mingw, поэтому вполне возможно, что gcc для linux не поддерживает #include . – ScottD