作为一种学习练习,我正在努力加快在各种体系结构上使用SIMD的矩阵乘法代码。我对SSE2的3D矩阵乘法码有一个奇怪的问题,它的性能在两个极端之间跳跃,大约5ms(预期)或100万次操作的〜100ms。这个SSE2代码为什么执行不一致?
这段代码所做的唯一不好的事情就是未对齐的存储/加载和最后的黑客来将向量存储到内存中而没有第四个元素践踏内存。这可以解释一些性能差异,但性能差异如此之大的事实让我怀疑我错过了一些重要的东西。
我已经尝试了几件事情,但在睡眠后我会再试一次。
查看下面的代码。 m_matrix变量在16字节边界上对齐。
void Matrix3x3::MultiplySSE2(Matrix3x3 &other, Matrix3x3 &output)
{
__m128 a_row, r_row;
__m128 a1_row, r1_row;
__m128 a2_row, r2_row;
const __m128 b_row0 = _mm_load_ps(&other.m_matrix[0]);
const __m128 b_row1 = _mm_loadu_ps(&other.m_matrix[3]);
const __m128 b_row2 = _mm_loadu_ps(&other.m_matrix[6]);
// Perform dot products with first row
a_row = _mm_set1_ps(m_matrix[0]);
r_row = _mm_mul_ps(a_row, b_row0);
a_row = _mm_set1_ps(m_matrix[1]);
r_row = _mm_add_ps(_mm_mul_ps(a_row, b_row1), r_row);
a_row = _mm_set1_ps(m_matrix[2]);
r_row = _mm_add_ps(_mm_mul_ps(a_row, b_row2), r_row);
_mm_store_ps(&output.m_matrix[0], r_row);
// Perform dot products with second row
a1_row = _mm_set1_ps(m_matrix[3]);
r1_row = _mm_mul_ps(a1_row, b_row0);
a1_row = _mm_set1_ps(m_matrix[4]);
r1_row = _mm_add_ps(_mm_mul_ps(a1_row, b_row1), r1_row);
a1_row = _mm_set1_ps(m_matrix[5]);
r1_row = _mm_add_ps(_mm_mul_ps(a1_row, b_row2), r1_row);
_mm_storeu_ps(&output.m_matrix[3], r1_row);
// Perform dot products with third row
a2_row = _mm_set1_ps(m_matrix[6]);
r2_row = _mm_mul_ps(a2_row, b_row0);
a2_row = _mm_set1_ps(m_matrix[7]);
r2_row = _mm_add_ps(_mm_mul_ps(a2_row, b_row1), r2_row);
a2_row = _mm_set1_ps(m_matrix[8]);
r2_row = _mm_add_ps(_mm_mul_ps(a2_row, b_row2), r2_row);
// Store only the first 3 elements in a vector so we dont trample memory
_mm_store_ss(&output.m_matrix[6], _mm_shuffle_ps(r2_row, r2_row, _MM_SHUFFLE(0, 0, 0, 0)));
_mm_store_ss(&output.m_matrix[7], _mm_shuffle_ps(r2_row, r2_row, _MM_SHUFFLE(1, 1, 1, 1)));
_mm_store_ss(&output.m_matrix[8], _mm_shuffle_ps(r2_row, r2_row, _MM_SHUFFLE(2, 2, 2, 2)));
}
做100万次测试几次,并获得平均时间。只做一次测试会给你带来不可靠的结果。 – CoffeeandCode
@CoffeeandCode我正在将平均数作为测试平台的一部分。与具有SSE2的2D和4D矩阵相比,平均时间仍然是一个异常。统计不能解释步进行为,代码错误。 – BlamKiwi
Idk,男人。如果有效,我不会说它有问题。你怎么做一个未对齐的商店btw? – CoffeeandCode