gpt4 book ai didi

visual-c++ - _addcarry_u64 和 _addcarryx_u64 与 MSVC 和 ICC

转载 作者:行者123 更新时间:2023-12-03 22:42:26 24 4
gpt4 key购买 nike

MSVC 和 ICC 都支持内在函数 _addcarry_u64_addcarryx_u64 .

根据 Intel's Intrinsic Guidewhite paper这些应该映射到 adcxadox分别。但是,通过查看生成的程序集,很明显它们映射到 adcadcx并且没有映射到 adox 的内在函数.

此外,告诉编译器使用 /arch:AVX2 启用 AVX2在 MSVC-march=core-avx2 Linux 上的 ICC 没有区别。
我不确定如何使用 MSVC 和 ICC 启用 ADX。

documentation for MSVC列表 _addcarryx_u64使用ADX技术而_addcarry_u64没有上市技术。但是,这些内在函数的 MSVC 文档中的链接直接指向英特尔内在指南,该指南与 MSVC 自己的文档和生成的程序集相矛盾。

由此我得出结论,英特尔的内在指南和白皮书是错误的。

这对于 MSVC 来说是有意义的,它不允许内联汇编,它应该提供一种使用 adc 的方法。它对 _addcarry_u64 做了什么.
adcx的一大优势和 adox是它们在不同的标志上运行(进位 CF 和溢出 OF ),这允许两个独立的并行进位链。但是,由于 adox 没有内在函数这怎么可能?对于 ICC,至少可以使用内联汇编,但这在 64 位模式下的 MSVC 中是不可能的。

微软和英特尔的文档(白皮书和在线内在指南)现在都同意。
_addcarry_u64内在文档说只产生 adc . _addcarryx_u64内在可以产生 adcxadox .但是,对于 MSVC 2013 和 2015,_addcarryx_u64只生产 adcx . ICC 生产两者。

最佳答案

他们映射到 adc , adcxadox .编译器根据您如何使用它们来决定使用哪些指令。如果并行执行两个 big-int 加法,编译器将使用 adcxadox ,以获得更高的吞吐量。例如:

unsigned char c1 = 0, c2 = 0
for(i=0; i< 100; i++){
c1 = _addcarry_u64(c1, res[i], a[i], &res[i]);
c2 = _addcarry_u64(c2, res[i], b[i], &res[i]);
}

关于visual-c++ - _addcarry_u64 和 _addcarryx_u64 与 MSVC 和 ICC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29229371/

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