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