loadu / lddqu和赋值运算符有什么区别?

问题描述 投票:0回答:1

我正在使用SIMD向量进行一些计算,并对它们之间的差异感到好奇,如下所示。

__m128i vector2 = vector1;
__m128i vector2 = _mm_loadu_si128(&vector1);

所以,以上两个语句有什么区别?

c sse simd intrinsics
1个回答
0
投票

[就像彼得·科德斯(Peter Cordes)在他的评论中说的那样,如果vector1确实是__m128i,那就太复杂了。

但是,这不是_mm_loadu_si128的用例。尽管参数的类型为__m128i const*,但实际上更多是因为缺少好的选择和错误的决定。

_mm_loadu_si128实际上是要将任何16个字节的数据加载到向量寄存器中。如果要加载已对齐16个字节边界的数据,则应改用_mm_load_si128。如果您的数据未与16个字节的边界对齐,则它不是really一个__m128i,因此该参数的类型充其量只会误导您。

[英特尔(或任何人)选择使用__m128i const*的原因尚不完全清楚,但说实话,没有很多好的选择。 int const*并没有什么意义,因为我们要加载的并不总是32位带符号整数。他们本可以制作_mm_loadu_epi8_mm_loadu_epi16_mm_loadu_epi32等,但即使这样也不太正确,因为数据不需要与_Alignof(int)_Alignof(short)等等,尽管char在此实际上可以很好地工作。

正确的选择可能是设置参数void*,但是我想Intel希望表明他们确实想要16个字节的数据。 char mem_addr[16]在C99 +中可以,但在C ++中则可以,并且虽然SSE2与C99大约在同一时间问世,但许多编译器不支持C99(MSVC仍然不支持!)。

基本上,对于此功能,请忽略参数的类型并阅读说明。

© www.soinside.com 2019 - 2024. All rights reserved.