我以前使用SIMD运算符来提高代码的效率,但是我现在面临一个我无法解决的新错误。对于这项任务,速度是至关重要的。
在导入数据之前,将不知道数组的大小,并且可能非常小(100个值)或巨大(1000万个值)。对于后一种情况,代码工作正常,但是当我使用少于130036个数组值时遇到错误。
有谁知道导致此问题的原因以及解决方法?
我附上了(测试过的)代码,稍后将在更复杂的函数中使用。错误发生在“arg1List [i] = ...”
#include <iostream>
#include <xmmintrin.h>
#include <emmintrin.h>
void main()
{
int j;
const int loop = 130036;
const int SIMDloop = (int)(loop/4);
__m128 *arg1List = new __m128[SIMDloop];
printf("sizeof(arg1List)= %d, alignof(Arg1List)= %d, pointer= %p", sizeof(arg1List), __alignof(arg1List), arg1List);
std::cout << std::endl;
for (int i = 0; i < SIMDloop; i++)
{
j = 4*i;
arg1List[i] = _mm_set_ps((j+1)/100.0f, (j+2)/100.0f, (j+3)/100.0f, (j+4)/100.0f);
}
}
答案 0 :(得分:9)
对齐是原因。
MOVAPS - 移动对齐打包的单精度浮点值
[...]操作数必须在16字节边界上对齐,否则将生成一般保护异常(#GP)。
您可以在对齐指针后立即看到问题:
__m128 *arg1List = new __m128[SIMDloop + 1];
arg1List = (__m128*) (((int) arg1List + 15) & ~15);