【发布时间】:2015-11-21 14:29:39
【问题描述】:
我需要找到一维矩阵中最大的元素及其列和行索引。
我使用一维矩阵,所以首先需要找到最大元素的索引,然后很容易得到行和列。
我的问题是我无法获得该索引。
我有一个可以找到最大元素并使用 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];
}
谁能帮我找到最大元素的索引并让我的 AVX 版本工作?
【问题讨论】:
-
我没有在您的 AVX 中查看 et,但您的 SSE 功能存在问题。这可能是您的 AVX 的相同原因: for (i = 4; i
-
@user3545806 保证
dims始终是 8 的倍数。 -
除了 return max(max(max(max_v[0], max_v[1]), max(max_v[2],max_v[3] )), .. .);在 _m256 y 行之前?
-
@user3545806 不,我在此处发布的代码与我在计算机上运行的代码完全相同。
-
要使查找最大元素 AVX 函数工作(返回最大元素的值),您需要将最后 5 行替换为 return max(max(max(max_v[0], max_v[1] ), max(max_v[2], max_v[3])), max(max(max_v[4], max_v[5]), max(max_v[6], max_v[7])));查找索引比较棘手,因为您需要进入数组并再次查找它。根据我过去的经验,如果您编写的代码没有显式 AVX/SSE,您可能会获得更快的代码,因为编译器可以为您优化 ti。