所以我在学习使用SSE内在函数编程的玩具示例时遇到了麻烦。我在其他帖子中读到,有时使用_mm_load_ps函数的分段错误是由于没有正确对齐,但我认为应该通过属性来解决((对齐(16) )))我做的事情。此外,当我在代码中注释掉第23或24行(或两者)时,问题就消失了,但显然这会使代码无效。
#include <iostream>
using namespace std;
int main()
{
float temp1[] __attribute__((__aligned__(16))) = {1.1,1.2,1.3,14.5,3.1,5.2,2.3,3.4};
float temp2[] __attribute__((__aligned__(16))) = {1.2,2.3,3.4,3.5,1.2,2.3,4.2,2.2};
float temp3[8];
__m128 m, *m_result;
__m128 arr1 = _mm_load_ps(temp1);
__m128 arr2 = _mm_load_ps(temp2);
m = _mm_mul_ps(arr1, arr2);
*m_result = _mm_add_ps(m, m);
_mm_store_ps(temp3, *m_result);
for(int i = 0; i < 4; i++)
{
cout << temp3[i] << endl;
}
m_result++;
arr1 = _mm_load_ps(temp1+4);
arr2 = _mm_load_ps(temp2+4);
m = _mm_mul_ps(arr1, arr2);
*m_result = _mm_add_ps(m,m);
_mm_store_ps(temp3, *m_result);
for(int i = 0; i < 4; i++)
{
cout << temp3[i] << endl;
}
return 0;
}
第23行是arr1 = _mm_load_ps(temp1 + 4)。我可以做一个或另一个但不是两个都很奇怪。任何帮助将不胜感激,谢谢!
答案 0 :(得分:6)
你的问题是你声明了一个指针__m128 *m_result
,但你永远不会为它分配任何空间。稍后你还会m_result++
指向另一个尚未分配的内存地址。这里没有理由使用指针。
#include <xmmintrin.h> // SSE
#include <iostream>
using namespace std;
int main()
{
float temp1[] __attribute__((__aligned__(16))) = {1.1,1.2,1.3,14.5,3.1,5.2,2.3,3.4};
float temp2[] __attribute__((__aligned__(16))) = {1.2,2.3,3.4,3.5,1.2,2.3,4.2,2.2};
float temp3[8];
__m128 m, m_result;
__m128 arr1 = _mm_load_ps(temp1);
__m128 arr2 = _mm_load_ps(temp2);
m = _mm_mul_ps(arr1, arr2);
m_result = _mm_add_ps(m, m);
_mm_store_ps(temp3, m_result);
for(int i = 0; i < 4; i++)
{
cout << temp3[i] << endl;
}
arr1 = _mm_load_ps(temp1+4);
arr2 = _mm_load_ps(temp2+4);
m = _mm_mul_ps(arr1, arr2);
m_result = _mm_add_ps(m,m);
_mm_store_ps(temp3, m_result);
for(int i = 0; i < 4; i++)
{
cout << temp3[i] << endl;
}
return 0;
}
答案 1 :(得分:3)
(1)m_result
只是wild pointer:
__m128 m, *m_result;
将所有*m_result
更改为m_result
并删除m_result++;
。 (m_result
只是一个临时的向量变量,您随后将其存储到temp3
)。
(2)您的两个商店可能未对齐,因为temp3
没有保证对齐 - 要么改变:
float temp3[8];
为:
float temp3[8] __attribute__((__aligned__(16)));
或使用_mm_storeu_ps
:
_mm_storeu_ps(temp3, m_result);
^^^