gpt4 book ai didi

c - 使用英特尔 SSE SIMD 内部函数

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:06 25 4
gpt4 key购买 nike

我有一个关于英特尔 SSE 内部函数的各种算术运算的问题。做 _mm_add_ps 和做 _mm_add_ps 有什么区别? _mm_add_epi8/16/32?我想确保我的数据始终保持一致。

在我执行此操作时的示例代码中:

 __m128 u1 = _mm_load_ps(&V[(i-1)]);

我遇到了段错误。但是当我这样做时:

 __m128 u1 = _mm_loadu_ps(&V[(i-1)]);

它工作正常。

因为我希望我的数据对齐,所以我声明了这样的数组:

 posix_memalign((void**)&V, 16, dx*sizeof(float));

谁能帮忙解释一下。

最佳答案

_mm_add_psfloat 加在一起,其中 _mm_add_epi8/16/32 添加整数,它们不是 float 。

_mm_loadu_ps 要求您的 float 为 16 字节(128 位)对齐,而 _mm_load_ps 确实需要 16 字节对齐。

因此,如果您在第一个上出现段错误,则您的对齐方式是错误的。

posix_memalign 页面上是这样写的:

The posix_memalign() function shall fail if:

[EINVAL] The value of the alignment parameter is not a power of two multiple of sizeof( void *).

我不确定 sizeof(float) == sizeof(void*) ??每this ,它在 C 中似乎是相同的(在 32 位系统上)。好的,这里有点小技巧,因为指针的大小通常是 CPU 寄存器宽度的大小,32 位或 64 位(8 字节)取决于所使用的系统,而 float 通常是 32 位(4 个字节)

您的对齐分配应该看起来更像这样:

posix_memalign((void**)&V, 16, dx*sizeof(void*)); //since it will the correct size for your platform.  You can always cast to `float` later on.

关于c - 使用英特尔 SSE SIMD 内部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11054755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com