Мне нужно найти самый большой элемент в матрице 1d и его индексы столбцов и строк.Найти наибольший элемент в матрице и его индексы столбцов и строк с использованием SSE и AVX
Я использую 1d матрицу, поэтому нужно сначала найти индекс максимального элемента, а затем легко получить строку и столбец.
Моя проблема в том, что я не могу получить этот индекс.
У меня есть рабочая функция, которая находит наибольший элемент и использует SSE, здесь:
float find_largest_element_in_matrix_SSE(float* m, unsigned const int dims)
{
size_t i;
int index = -1;
__m128 max_el = _mm_loadu_ps(m);
__m128 curr;
for (i = 4; i < dims * dims; i += 4)
{
curr = _mm_loadu_ps(m + i);
max_el = _mm_max_ps(max_el, curr);
}
__declspec(align(16))float max_v[4] = { 0 };
_mm_store_ps(max_v, max_el);
return max(max(max(max_v[0], max_v[1]), max_v[2]), max_v[3]);
}
, а также у меня есть нерабочая функция, которая использует AVX:
float find_largest_element_in_matrix_AVX(float* m, unsigned const int dims)
{
size_t i;
int index = -1;
__m256 max_el = _mm256_loadu_ps(m);
__m256 curr;
for (i = 8; i < dims * dims; i += 8)
{
curr = _mm256_loadu_ps(m + i);
max_el = _mm256_max_ps(max_el, curr);
}
__declspec(align(32))float max_v[8] = { 0 };
_mm256_store_ps(max_v, max_el);
__m256 y = _mm256_permute2f128_ps(max_el, max_el, 1);
__m256 m1 = _mm256_max_ps(max_el, y);m1[1] = max(max_el[1], max_el[3])
__m256 m2 = _mm256_permute_ps(m1, 5);
__m256 m_res = _mm256_max_ps(m1, m2);
return m[0];
}
Может ли кто-нибудь помочь мне с нахождением индекса элемента max и сделать мою версию AVX?
Я не смотрел и др в вашем AVX, но у вас есть проблема в вашей функции SSE. Это может быть той же причиной для вашего AVX: для (i = 4; i
VladimirS
@ user3545806 гарантируется, что 'dims' всегда кратно 8. –
Вы пытаетесь сделать что-то еще вне max (max (max (max_v [0], max_v [1]), max (max_v [2], max_v [3])), ...); до строки _m256 y? – VladimirS