如果一个64字节的缓冲区被大量读/写,那么它很可能会被保存在L1中; 但有没有办法强迫这种行为?
同样,给一个核心独占访问这64个字节,并告诉它不要将数据与其他核心和内存控制器同步,这样这些64个字节总是存在于一个核心的L1中,无论CPU是否认为它经常被使用.
假设你有值rax,rdx你想加载到xmm寄存器中.
一种方法是:
movq xmm0, rax
pinsrq xmm0, rdx, 1
Run Code Online (Sandbox Code Playgroud)
虽然这很慢!有没有更好的办法?
AVX 具有将 16 位和 32 位整数插入和提取到__m256i向量中的指令:_mm256_insert_epi16, _mm256_insert_epi32, _mm256_extract_epi16, _mm256_extract_epi32。
但是,AVX-512 似乎没有等效的说明。为__m512i向量实现这些方法的适当方法是什么?IE
__m512i _mm512_insert_epi16(__m512i a, __int16 i, int index)__m512i _mm512_insert_epi32(__m512i a, __int32 i, int index)int _mm512_extract_epi16(__m512i a, int index)int _mm512_extract_epi32(__m512i a, int index)我正在考虑在纯装配中实现SHA3.SHA3的内部状态为17个64位无符号整数,但由于它使用了转换,如果寄存器中有44个这样的整数,则可以实现最佳情况.另外还有一个临时寄存器.在这种情况下,我将能够在寄存器中进行整个转换.
但这是不现实的,优化可能一直到甚至只有几个寄存器.不过,根据这个问题的答案,更多可能更好.
我想至少使用MMX寄存器进行快速存储,即使我需要交换到其他寄存器进行计算.但我担心这是古建筑.
在MMX寄存器和RAX之间的数据传输是否比在堆栈上索引u64并从可能是L1缓存中访问它们更快?或者即便如此,除了我应该注意的速度考虑之外,还有隐藏的陷阱吗?我对一般情况感兴趣,所以即使我的计算机上的一个比另一个更快,它仍然可能是不确定的.
这个想法是,我想收集的返回的值double成一个矢量寄存器,用于机加工imm width在一个时间而不第一存储回到存储器。
特定的处理vfma与其他两个操作数都是constexpr,因此它们可以简单地由_mm256_setr_pd调用或从 中对齐/未对齐的内存加载constexpr array。
有没有办法%ymm直接从 value in 中将double 存储在特定位置以%rax进行收集?
目标机器是 Kaby Lake。更有效的未来向量指令也是受欢迎的。