我在使用_mm_store_ps命令时遇到问题。当我使用它时,我遇到了分割错误(我知道这就是问题所在,因为当我注释掉该行时,分割错误就会消失)。这很奇怪,因为我使用的是手动要求编译器对齐的静态数组,并且使用_mm_storeu_ps不会使问题消失。下面是代码的相关部分:
//Directly access array instead of using Boost interface
boost::numeric::ublas::matrix<float>::iterator2 it = result.begin2();
float temp[4] __attribute__((aligned__(16))), temp2 = 0;
//Use SSE
__m128 m1, sse_right1, sse_left1, store_sse __attribute__((aligned (16))) = _mm_set_ps1(0);
unsigned k = 0;
//Iterate over the dimensions of the matrices
for (unsigned i = 0; i < ls1; i++)
{
for (unsigned j = 0; j < rs2; j++)
{
while (k + 3 < ls2)
{
sse_right1 = _mm_load_ps(arr + k + j * rs1);
sse_left1 = _mm_load_ps(left_arr + k + i * ls2);
m1 = _mm_mul_ps(sse_right1, sse_left1);
store_sse = _mm_add_ps(store_sse,m1);
k += 4;
}
//If ls2 isn't divisible by 4
while (k < ls2)
{
temp2 += left_arr[i * ls2 + k] * arr[k + j * rs1];
k++;
}
if (ls2 >= 4)
{
_mm_store_ps(temp, store_sse);
for (unsigned l = 0; l < 4; l++)
{
temp2 += temp[l];
}
}
*it = temp2;
store_sse = _mm_set_ps1(0);
temp2 = 0;
k = 0;
it++;
}
分段错误不是数组边界的问题,因为执行会将其降低到_mm_store_ps行。任何帮助将不胜感激,谢谢!
编辑:问题出在_mm_load_ps,当我使用_mm_loadu_ps时,它运行良好。我使用静态数组作为_mm_load_ps参数,所以我不知道为什么我会遇到问题。
SSE 要求其内存访问具有 16 字节对齐的地址。如果您不是从阵列外部读取,这可能是您的问题。
尝试使用 _mm_storeu_ps
和 _mm_loadu_ps
,它们是未对齐的版本。它们会运行得慢一点,但会起作用。确认这是问题所在后,请首先尝试对齐内存以获得最佳性能。