c - SSE 向量化结果错误

标签 c x86 vectorization sse simd

下面的代码生成以下输出:

6 6 0 140021597270387

这意味着只有前两个位置计算正确。但是,我正在处理长整型(4 个字节),而 __m128i 可以容纳超过 4 个长整型。

long* AA = (long*)malloc(32*sizeof(long));
long* BB = (long*)malloc(32*sizeof(long));

for(i = 0; i<4;i++){
    AA[i] = 2;
    BB[i] = 3;
}

__m128i* m1 = (__m128i*) AA;
__m128i* m2 = (__m128i*) BB;

__m128i m3 = _mm_mul_epu32(m1[0],m2[0]);

long* CC = (long*) malloc(16 * sizeof(long));
CC = (long*)&m3;

for (i = 0; i < 4; i++)
    printf("%ld \n",CC[i]);

分配:

long* AA = (long*) memalign(16 * sizeof(long), 16);

(和其余 vector )生成一个段。过错。有人可以评论一下吗?

谢谢

最佳答案

1) 不要使用不确定大小的类型,例如long,使用特定的固定类型,例如uint32_t

2) 不要使用 malloc - 它不能保证返回 16 字节对齐的内存,请使用 memalign或同等水平*

3) 不要在 C 中转换 malloc(或任何其他函数返回 void *)的结果

4) 无需再分配另一个缓冲区来打印结果

固定代码:

uint32_t* AA = memalign(32*sizeof(uint32_t), 16);
uint32_t* BB = memalign(32*sizeof(uint32_t), 16);

for (i = 0; i < 4; i++){
    AA[i] = 2;
    BB[i] = 3;
}

__m128i* m1 = (__m128i*)AA;
__m128i* m2 = (__m128i*)BB;

__m128i m3 = _mm_mul_epu32(m1[0], m2[0]);    // 2 x 32x32->64 bit unsigned multiplies -> m3

uint64_t* CC = (uint64_t*)&m3;

for (i = 0; i < 2; i++)                      // display 2 x 64 bit result values
    printf("%llu\n", CC[i]);

*请注意,根据您的平台,您可能需要使用 memalign 以外的调用来分配适当对齐的内存,例如posix_memalign_mm_malloc_aligned_malloc (WIN32)。

关于c - SSE 向量化结果错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21418050/

相关文章:

matlab - 将一个数组嵌入到另一个数组中

在 C 中使用 for 循环创建矩阵

python - gc 上的段错误,使用 ctypes

assembly - CMP 和 2 的补码

assembly - 为 X86 编译时如何防止函数对齐到 16 字节边界?

assembly - 如何确定寄存器是从右到左加载,反之亦然

arrays - Matlab:使用逻辑索引删除 IF-ELSE 条件语句

python - 对两个 Pandas DataFrame 进行矢量化操作以创建一个新的 DataFrame

c - while循环正在覆盖C中链表的头节点

C程序在插入后查找数组中元素的数量并且在插入时不计数