У меня возникли проблемы с векторизацией кода C с использованием векторных инструкций SSE. Код, который я должен победить, -
#define N 1000
void matrix_mul(int mat1[N][N], int mat2[N][N], int result[N][N])
{
int i, j, k;
for (i = 0; i < N; ++i)
{
for (j = 0; j < N; ++j)
{
for (k = 0; k < N; ++k)
{
result[i][k] += mat1[i][j] * mat2[j][k];
}
}
}
}
Вот что я получил до сих пор:
void matrix_mul_sse(int mat1[N][N], int mat2[N][N], int result[N][N])
{
int i, j, k; int* l;
__m128i v1, v2, v3;
v3 = _mm_setzero_si128();
for (i = 0; i < N; ++i)
{
for (j = 0; j < N; j += 4)
{
for (k = 0; k < N; k += 4)
{
v1 = _mm_set1_epi32(mat1[i][j]);
v2 = _mm_loadu_si128((__m128i*)&mat2[j][k]);
v3 = _mm_add_epi32(v3, _mm_mul_epi32(v1, v2));
_mm_storeu_si128((__m128i*)&result[i][k], v3);
v3 = _mm_setzero_si128();
}
}
}
}
После исполнения я получил неверный результат. Я знаю, что причина в загрузке из памяти в v2. Я перебираю mat1 в главном порядке строк, поэтому мне нужно загрузить mat2 [0] [0], mat2 [1] [0], mat2 [2] [0], mat2 [3] [0] .... но что фактически загружается mat2 [0] [0], mat2 [0] [1], mat2 [0] [2], mat2 [0] [3] ... потому что mat2 хранится в памяти в главном порядке строк. Я пытался решить эту проблему, но без каких-либо улучшений.
Может кто-нибудь помочь мне, пожалуйста.