Приведение обычного 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**
,
Кто-нибудь знает?
Дело в том, что многомерные массивы хранятся в одном непрерывном блоке памяти (стандарт 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 чисел, используя этот указатель, и разыменовать его, чтобы получить двойное число, которое затем можно преобразовать / преобразовать в другой тип.
Других решений пока нет …