英特尔的内在指南似乎正在与眼前的价值观做出神秘的区分。他们给一些人贴上“康斯特”的标签,有些人不叫“康斯特”。在实践中,这两种类型,无论是编译时间常数还是编译器都会抱怨。我只是想知道为什么会有区别?我漏掉了什么?
这里有一个英特尔所说的例子:
_mm_blend_epi16 (__m128i a, __m128i b, const int imm8)
_mm_srli_si128 (__m128i a, int imm8)发布于 2016-07-14 05:15:50
假设你认为const是一种改进,那么英特尔的旧东西写得不如他们的新东西好。
注意,blend_epi16是SSE4.1,而srli_si128是SSE2。他们可能决定在为the 4.1添加本质元素时,加强论点需要是编译时常数的观点。
256位版本的AVX2内部使用const:__m256i _mm256_srli_si256 ( __m256i a, const int imm)。这基本上证实了他们只是还没有想到const,因为他们开始使用const进行相同的指令。
还要注意的是,他们对_mm_srli_si128名称对说明非常不满,因此他们为它引入了一个新的名称:在新代码中,_mm_bsrli_si128应该是首选的,以使它更清楚地表明它是字节移位,而不是128位宽的位移位。这与_mm_srli_epi64有很大的不同。不幸的是,指令参考手册没有提到bsrli名称。
AVX512加载/存储本质将使用void*而不是__m128i*,这是另一个很好的改变。
所以英特尔的做法基本上是不同的,因为旧的方式是次优的,而不是因为他们必须这样做。
https://stackoverflow.com/questions/38365778
复制相似问题