Переменные printf SSE __m128i в Visual Studio

У меня есть код, который использует оптимизацию SIMD и различные переменные __m128i. Очевидно, что printf не может с ними справиться. Есть ли простой способ распечатать их содержимое? Я использую Visual Studio 2010 с C/C++.


person Gustavo Litovsky    schedule 10.12.2012    source источник
comment
Получить нижнюю и верхнюю части как int64_t и распечатать их? Сверните свое собственное преобразование в строку, разделив на десять, пока не достигнете 0, конвертируя в ASCII, а затем меняя строку?   -  person    schedule 10.12.2012
comment
Это определенно вариант, который я также рассматривал. Я надеялся на еще более простое решение (хотя это совсем не сложно).   -  person Gustavo Litovsky    schedule 10.12.2012


Ответы (2)


Используйте эту функцию, чтобы напечатать их:

void print128_num(__m128i var)
{
    uint16_t *val = (uint16_t*) &var;//can also use uint32_t instead of 16_t
    printf("Numerical: %i %i %i %i %i %i %i %i \n", 
           val[0], val[1], val[2], val[3], val[4], val[5], 
           val[6], val[7]);
}

Вы разделяете 128 бит на 16 бит (или 32 бита) перед их печатью.

Это способ 64-битного разделения и печати, если у вас есть 64-битная поддержка:

void print128_num(__m128i var) 
{
    int64_t *v64val = (int64_t*) &var;
    printf("%.16llx %.16llx\n", v64val[1], v64val[0]);
}

Замените llx на lld, если хотите вывести int.

person askmish    schedule 10.12.2012
comment
printf("Numerical: %i %i %i %i %i %i %i %i \n", val[7], val[6], val[5], val[4], val[3], val[2], val[1], val[0]); кажется более логичным порядком печати. - person enthusiasticgeek; 29.05.2013

Я нашел ответ, основанный на подходе Влада:

__m128i var;
 printf("0x%I64x%I64x\n",var.m128i_i64[1], var.m128i_i64[0]);

Это печатает все 128-битное значение в виде шестнадцатеричной строки.

person Gustavo Litovsky    schedule 10.12.2012