Ini adalah pertanyaan tingkat rendah. Dalam perakitan x86 ada dua instruksi SSE:
MOVDQA xmmi, m128
dan
MOVNTDQA xmmi, m128
Manual Pengembang Perangkat Lunak IA-32 mengatakan bahwa NT di MOVNTDQA adalah singkatan dari Non-Temporal , dan sebaliknya itu sama dengan MOVDQA.
Pertanyaan saya adalah, apa arti Non-Temporal ?
MOVNTDQA xmmi, m128
adalah beban NT, sementara semua instruksi NT lainnya disimpan, kecualiprefetchnta
. Jawaban yang diterima di sini sepertinya hanya berbicara tentang toko. Ini adalah apa yang saya dapat temukan tentang beban NT . TL: DR: semoga CPU melakukan sesuatu yang berguna dengan petunjuk NT untuk meminimalkan polusi cache, tetapi mereka tidak menimpa semantik memori WB "normal" yang diurutkan dengan kuat, jadi mereka harus menggunakan cache.Jawaban:
Instruksi SSE Non-Temporal (MOVNTI, MOVNTQ, dll.), Jangan ikuti aturan koherensi cache normal. Oleh karena itu penyimpanan non-temporal harus diikuti dengan instruksi SFENCE agar hasilnya dapat dilihat oleh prosesor lain secara tepat waktu.
Ketika data diproduksi dan tidak (segera) dikonsumsi lagi, fakta bahwa operasi penyimpanan memori membaca baris cache penuh terlebih dahulu dan kemudian memodifikasi data cache merusak kinerja. Operasi ini mendorong data keluar dari cache yang mungkin diperlukan lagi untuk mendukung data yang tidak akan segera digunakan. Ini terutama berlaku untuk struktur data besar, seperti matriks, yang diisi dan kemudian digunakan nanti. Sebelum elemen terakhir dari matriks diisi, ukuran yang sangat besar akan menghapus elemen pertama, membuat cache penulisan tidak efektif.
Untuk situasi ini dan yang serupa, prosesor menyediakan dukungan untuk operasi tulis non-temporal. Non-temporal dalam konteks ini berarti data tidak akan segera digunakan kembali, jadi tidak ada alasan untuk menyimpannya. Operasi tulis non-temporal ini tidak membaca baris cache dan kemudian memodifikasinya; sebaliknya, konten baru langsung ditulis ke memori.
Sumber: http://lwn.net/Articles/255364/
sumber
SFENCE
mungkin tidak diperlukan. Setidaknya di utas yang sama. Bisakah Anda juga melihat?sfence
diperlukan untuk toko NT, sedangkan itu tidak pernah diperlukan hanya untuk toko normal. Toko NT tidak dipesan sehubungan dengan toko lain (NT atau tidak), seperti yang terlihat oleh utas lain , tanpasfence
. Namun, untuk membaca dari utas yang sama yang melakukan penyimpanan, Anda tidak perlusfence
: utas tertentu akan selalu melihat penyimpanannya sendiri dalam urutan program, terlepas dari apakah itu toko NT atau bukan.Espo cukup tepat sasaran. Hanya ingin menambahkan dua sen saya:
Frasa "non temporal" berarti kurang lokalitas temporal. Cache mengeksploitasi dua jenis lokalitas - spasial dan temporal, dan dengan menggunakan instruksi non-temporal Anda memberi isyarat kepada prosesor bahwa Anda tidak mengharapkan item data digunakan dalam waktu dekat.
Saya sedikit skeptis tentang rakitan kode tangan yang menggunakan instruksi kontrol cache. Dalam pengalaman saya, hal-hal ini menyebabkan lebih banyak bug jahat daripada peningkatan kinerja yang efektif.
sumber
Menurut Panduan Pengembang Perangkat Lunak Arsitektur Intel® 64 dan IA-32, Volume 1: Arsitektur Dasar, bab "Pemrograman dengan Intel Streaming SIMD Extensions (Intel SSE)":
Penyimpanan Data Temporal vs. Non-Temporal
Deskripsi beban non-temporal dan instruksi penyimpanan. Sumber: Panduan Pengembang Perangkat Lunak Arsitektur Intel 64 dan IA-32, Volume 2: Referensi Set Instruksi
BEBAN (MOVNTDQA — Memuat Petunjuk Selaras Non-Temporal Ganda Quadword)
Perhatikan bahwa, seperti yang dikomentari Peter Cordes, ini tidak berguna pada memori WB (tulis kembali) normal pada prosesor saat ini karena petunjuk NT diabaikan (mungkin karena tidak ada prefetcher HW yang sadar NT) dan semantik muatan penuh yang diurutkan dengan kuat berlaku .
prefetchnta
dapat digunakan sebagai beban pengurang polusi dari memori WBSTORE (MOVNTDQ — Simpan Integer yang Dikemas Menggunakan Petunjuk Non-Temporal)
Menggunakan terminologi yang ditentukan dalam Kebijakan dan Performa Penulisan Cache , mereka dapat dianggap sebagai operasi tulis (no-write-alokasi, no-fetch-on-write-miss).
Terakhir, mungkin menarik untuk meninjau catatan John McAlpin tentang penyimpanan non-temporal .
sumber
MOVNTDQA
hanya melakukan sesuatu yang khusus pada wilayah memori WC (Unacheable Write-Combining), misalnya RAM video. Ini sama sekali tidak berguna pada memori WB (tulis-balik) normal pada HW saat ini, petunjuk NT diabaikan dan semantik muatan penuh yang diurutkan dengan kuat berlaku.prefetchnta
dapat berguna, sebagai beban pengurang polusi dari memori WB. Apakah arsitektur x86 saat ini mendukung beban non-temporal (dari memori "normal")? .