我有以下代码(手动版本来自阿德勒的答案)
#include <iostream>
#include <nmmintrin.h>
#define POLY2 0x82f63b78
uint32_t crc32c2(uint32_t crc, const unsigned char *buf, size_t len)
{
int k;
crc = ~crc;
while (len--) {
crc ^= *buf++;
for (k = 0; k < 8; k++)
crc = crc & 1 ? (crc >> 1) ^ POLY2 : crc >> 1;
}
return ~crc;
}
int main(int argc, char **argv)
{
const unsigned int val = 5;
std::cout << std::hex << crc32c2(0,(const unsigned char*)&val,4) << std::endl;
std::cout …Run Code Online (Sandbox Code Playgroud) 考虑:
movdqa xmm0, xmmword ptr [rcx]
movdqa xmm1, xmmword ptr [rcx + 16]
movdqa xmm2, xmmword ptr [rcx + 32]
movdqa xmm3, xmmword ptr [rcx + 48]
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常。rcx是 32 位 uint 数组的第一个元素的地址。
ymm但是,当尝试以类似的方式使用时:
vmovdqa ymm0, ymmword ptr [rcx]
vmovdqa ymm1, ymmword ptr [rcx + 32]
Run Code Online (Sandbox Code Playgroud)
该代码随机抛出 sigsegvs: Exception thrown at 0x00007FF95ACC102C (Asm.dll) in Asm.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.。
为什么,我怎样才能让它发挥作用?
我的CPU是i5-10210u(支持AVX-256)。在 X64 发布/调试中运行。
英特尔内在函数指南列出的吞吐量是每个线程还是每个核心?
我有一个用 F# for .NET 编写的使用 SSE2 的函数。我使用 AVX2 写了同样的东西,但根本问题是相同的。a 的预期目的是什么MoveMask?我知道它对我的目的有效,我想知道为什么。
我正在迭代两个 64 位浮点数组a和b,测试它们的所有值是否匹配。我正在使用该CompareEqual方法(我相信该方法正在包装对 的调用__m128d _mm_cmpeq_pd)一次比较多个值。然后我将该结果与64Vector128位0.0浮点数进行比较。我的推理是,在值不匹配的情况下,结果CompareEqual将给出一个值。0.0到目前为止,这是有道理的。
然后我Sse2.MoveMask对与零向量的比较结果使用该方法。我之前曾研究过使用SSEand for 匹配,并且我看到了人们用于测试非零值AVX的示例。MoveMask我相信这种方法正在使用int _mm_movemask_epi8英特尔内在函数。我已包含 F# 代码和 JIT 的程序集。
这真的是一个目的吗MoveMask,还是只是一个令人高兴的巧合,它可以达到这些目的。我知道我的代码有效,我想知道它为什么有效。
#nowarn "9" "51" "20" // Don't want warnings about pointers
open System
open FSharp.NativeInterop
open …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写 BSF 的矢量化实现作为练习,但我陷入困境,它不起作用。
算法:
short bitScanForward(int16_t bb)
{
constexpr uint16_t two = static_cast<uint16_t>(2);
constexpr uint16_t zero = static_cast<uint16_t>(0);
uint16_t lsb;
bb &= -bb;
lsb = (unsigned short)bb
| (unsigned short)(bb >> short(8));
return static_cast<short>(((((((unsigned short)(bb >>
short(8)) != zero) * two)
+ ((lsb & unsigned short(0xf0f0)) != zero)) * two)
+ ((lsb & unsigned short(0xcccc)) != zero)) * two)
+ ((lsb & unsigned short(0xaaaa)) != zero);
}
Run Code Online (Sandbox Code Playgroud)
我的矢量代码:
[[nodiscard]] inline __m128i _mm_cmpneq_epi16(const __m128i& a, const __m128i& …Run Code Online (Sandbox Code Playgroud) 我正在阅读一篇关于if consteval (\xc2\xa73.2)的 C++ 论文,并看到一段显示constexpr strlen实现的代码:
constexpr size_t strlen(char const* s) {\n if constexpr (std::is_constant_evaluated()) {\n for (const char *p = s; ; ++p) {\n if (*p == \'\\0\') {\n return static_cast<std::size_t>(p - s);\n }\n } \n } else {\n __asm__("SSE 4.2 insanity"); \n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我是来询问__asm__else分支中的语句的。
我知道这是幽默,并不意味着要认真对待,但我仍然决定做一些研究,以防有人已经解释过。\n当我用谷歌搜索引用的消息时,我得到的结果不到 10 个,全部都是关于这段代码的.\n然后我研究了什么是SSE 4.2,发现它是一个CPU指令集,所以我真的不知道它在C++论文中出现的内容,有人有解释吗?\n感谢那些会阅读的人我的帖子。
\n如何为 __m128 向量制作 fabs() ?
我是否必须使用符号位将原始向量乘以 1.0f/-1.0f ?
没有找到任何指令集来做到这一点。
我不需要 __m256 或 512。我正在搜索 __m128 数据类型
我想从128位寄存器中提取值(第一个字16bits),我得到了这个命令,但这不起作用.设置a的值后会有一些算术运算,比变量里面会有一些算术运算最后会改变我想要提取第一个字......我怎么能这样做...
int r;
int inm=0;
__m128i a=_mm_setr_epi16(8,9,3,2,4,5,6,11);
_asm{
r = _mm_extract_epi16(a,inm);
}
Run Code Online (Sandbox Code Playgroud) 对不起我没有好头衔......
我正在读这个帖子: SSE中的矢量矩阵乘法
原始海报有以下代码
// xmm0 = (v0,v1,v2,v3)
movups xmm0, [eax]
// xmm0 = (v0,v0,v0,v0)
// xmm1 = (v1,v1,v1,v1)
// xmm2 = (v2,v2,v2,v2)
// xmm3 = (v3,v3,v3,v3)
shufps xmm3, xmm0, 255
shufps xmm2, xmm0, 170
shufps xmm1, xmm0, 85
shufps xmm0, xmm0, 0
Run Code Online (Sandbox Code Playgroud)
有人说以下:
但是根据手册真正发生了什么:(a,b,c,d)意味着a是0到31位,b是32到63位等等
// xmm0 = (v0,v1,v2,v3)
movups xmm0, [eax]
// xmm0 = (v0, v0, v0, v0)
shufps xmm0, xmm0, 0
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义,因为在线性数组模型中[elt0,elt1,elt2,....] elt0是Array [0].
令我困惑的是,根据手册,xmm寄存器的位图是[127 ... 0](见下图).
我就像看着位图的原始海报,并认为[elt0,elt2,elt3,elt4]的最左边是"11"位.
所以如果我想xmm0只包含v0
shufps xmm0, xmm0, 0xFF // 11 11 11 11 …Run Code Online (Sandbox Code Playgroud) 当我使用_mm_packus_epi16时,小于零的值将变为零,但高于127的数字将变为负值.
根据这个链接,它应该是无符号饱和度 http://msdn.microsoft.com/en-us/library/07ad1wx4%28v=vs.90%29.aspx
但没有发生
有什么建议?
码:
__m128i result, resultHi, resultLo;
//processing.....
result = _mm_packus_epi16(resultLo, resultHi);
Run Code Online (Sandbox Code Playgroud)