Что эквивалентно v4sf и __attribute__ в Visual Studio C ++? - PullRequest
1 голос
/ 28 ноября 2011
typedef float v4sf __attribute__ ((mode(V4SF)));

Это в GCC.Кто-нибудь знает синтаксис эквивалентности?

VS 2010 покажет, что __attribute__ не имеет класса хранения этого типа, и режим не определен.

Я искал в Интернете, и он сказал

Эквивалентно __attribute__( aligned( size ) ) в GCC

Это полезно для бывших разработчиков Unix или людей, пишущих код, который работает на нескольких платформах, когда в GCC вы достигаете тех же результатов, используя атрибут (выровненный (...))

Для получения дополнительной информации см. Здесь: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Type-Attributes.html#Type-Attributes

Полный код GCC здесь: http://pastebin.com/bKkTTmH1

Ответы [ 2 ]

4 голосов
/ 28 ноября 2011

Если вы ищете директиву выравнивания в VC ++, это __declspec(align(16)). (или как вы хотите, чтобы выравнивание было)

И пример использования это:

__declspec(align(16)) float x[] = {1.,2.,3.,4.};

http://msdn.microsoft.com/en-us/library/83ythb65.aspx

Обратите внимание, что attribute (в GCC) и __declspec (в VC ++) являются расширениями, специфичными для компилятора.

РЕДАКТИРОВАТЬ:

Теперь, когда я еще раз посмотрю на код, потребуется больше работы, чем просто замена строки __attribute__ на эквивалент VC ++, чтобы заставить его скомпилироваться в VC ++.

VC ++ не имеет ничего, если вы используете эти макросы / функции:

  • __builtin_ia32_xorps
  • __builtin_ia32_loadups
  • __builtin_ia32_mulps
  • __builtin_ia32_addps
  • __builtin_ia32_storeups

Вам лучше просто заменить все эти компоненты на SSE intrinsics - который будет работать как на GCC, так и на VC ++.


Вот код, преобразованный в встроенные:

float *mv_mult(float mat[SIZE][SIZE], float vec[SIZE]) {
    static float ret[SIZE];
    float temp[4];
    int i, j;
    __m128 m, v, r;

    for (i = 0; i < SIZE; i++) {
        r = _mm_xor_ps(r, r);

        for (j = 0; j < SIZE; j += 4) {
            m = _mm_loadu_ps(&mat[i][j]);
            v = _mm_loadu_ps(&vec[j]);
            v = _mm_mul_ps(m, v);
            r = _mm_add_ps(r, v);
        }

        _mm_storeu_ps(temp, r);
        ret[i] = temp[0] + temp[1] + temp[2] + temp[3];
    }

    return ret;
}
1 голос
/ 28 ноября 2011

V4SF и его друзья имеют дело с «векторными расширениями» GCC:

http://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/Vector-Extensions.html#Vector%20Extensions

http://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/X86-Built-in-Functions.html

Я не уверен, сколько - если таковые имеютсяиз этого материала - поддерживается в MSVS / MSVC.Вот несколько ссылок:

http://www.codeproject.com/KB/recipes/sseintro.aspx?msg=643444

http://msdn.microsoft.com/en-us/library/y0dh78ez%28v=vs.80%29.aspx

http://msdn.microsoft.com/en-us/library/01fth20w.aspx

...