簡體   English   中英

在x86_64上非臨時性加載32位和64位值的C / C ++內在函數?

[英]C/C++ intrinsics for non-temporal loads of 32- and 64-bit values on x86_64?

在x86_64上是否存在C / C ++內部函數用於32位和64位值的非臨時負載(即,不從DRAM直接緩存的負載)?

我的編譯器是MSVC ++ 2017工具集v141。 但是,歡迎使用其他編譯器的內在函數,以及對底層匯編指令的引用。

在撰寫本文時(2017年8月) ,GP寄存器沒有任何非臨時性加載


唯一可用的非時間性指令是:

整數域

(v)movntdqa (加載),盡管此指令的名稱為,將在其自然邊界上對齊的128/256/512位分別移到xmm/ymm/zmm寄存器中。
(v)movntdq (存儲),盡管此指令的名稱為xmm/ymm/zmm寄存器,但將其移至128/256/512位,並按其自然邊界,存儲位置對齊。

GP寄存器

movnti (存儲)將32/64位GP寄存器存儲到內存中的DWORD / QWORD中。

MMX寄存器

movntq (存儲)將MMX寄存器存儲到內存中的QWORD中。

浮點域

(v)movntpd/s (存儲) (舊式和VEX編碼)xmm/ymm/zmm寄存器存儲到對齊的128/256/512位存儲器位置。 類似於movntdq但在FP域中。

(v)movntpd/s (存儲) (EVEX編碼)xmm/ymm/zmm寄存器存儲到對齊的512位存儲器位置,清除未使用的高位。 類似於movntdq但在FP域中。
英特爾手冊與此矛盾

蒙面電影

(v)maskmovdqu (存儲)根據掩碼將xmm寄存器的字節存儲在另一個xmm寄存器中。

(v)maskmovq (存儲)根據掩碼將MMX寄存器的字節存儲在另一個MMX寄存器中。

在這里看看: https : //software.intel.com/sites/landingpage/IntrinsicsGuide/#text=temporal

void _mm_stream_pi (__m64* mem_addr, __m64 a)
void _mm_stream_si32 (int* mem_addr, int a)

和其他一些

https://msdn.microsoft.com/zh-CN/library/hh977023.aspx

它實際上是VS2015文檔,但是VS2017一個(至少對我來說)很奇怪,雜亂無章,我在那找不到任何東西:)。

為此,至少我知道

void _mm_prefetch (char const* p, int i) is used for it. 

這些負載足夠短,僅通知uP不會從緩存中退出其他數據,而不會降低性能(因此,即使對於非臨時負載,如果緩存中有空間也將被緩存,但不會退出)任何數據)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM