SSE: приведение двойного ** к _m128d **

Приведение обычного double * к _m128d * довольно просто и понятно.
Предположим, у вас есть такой массив:

double arr[8] = {1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0};

Тогда _m128d презентация вроде бы будет выглядеть так:

_m128d m_arr[8] = { [1.0,2.0] , [3.0,4.0] , [5.0,6.0] , [7.0,8.0] };

потому что всегда хранятся 2 значения, если вы можете сказать это (так я это себе представляю).
Но как значения будут разделены, если я вместо этого использую матрицу 3х3 ??? Например.:

double mat[3][3] = { {1.0, 2.0, 3.0}, {1.0, 2.0, 3.0}, {1.0, 2.0, 3.0} };

Я пытаюсь просто суммировать все значения в матрице, но на самом деле не понимаю, как сделать это эффективно с SSE, поэтому мне нужно понять, как решается матрица _m128d**,
Кто-нибудь знает?

1

Решение

Дело в том, что многомерные массивы хранятся в одном непрерывном блоке памяти (стандарт C гарантирует это). Таким образом, вы можете использовать простой указатель для ссылки на них:

double mat[3][3] = { {1.0, 2.0, 3.0}, {1.0, 2.0, 3.0}, {1.0, 2.0, 3.0} };
double *ptr = (double *)mat;

Затем вы можете перебрать 9 чисел, используя этот указатель, и разыменовать его, чтобы получить двойное число, которое затем можно преобразовать / преобразовать в другой тип.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector