Rumah > pembangunan bahagian belakang > C++ > Adakah x86_64 Menyokong Operasi Atom pada Vektor Beregu dan SSE/AVX?

Adakah x86_64 Menyokong Operasi Atom pada Vektor Beregu dan SSE/AVX?

Mary-Kate Olsen
Lepaskan: 2024-11-27 06:58:10
asal
1037 orang telah melayarinya

Does x86_64 Support Atomic Operations on Doubles and SSE/AVX Vectors?

Operasi Titik Terapung Atom dan SSE/AVX Vector Load/Store pada x86_64

Walaupun C 11 menyokong std::atomic tanpa kunci, ia tetap tidak menyokong vektor AVX/SSE atom pada masa ini kerana kebergantungan CPU. Walau bagaimanapun, persoalan timbul: adakah x86_64 menyediakan sokongan peringkat pemasangan untuk operasi atom pada beregu atau vektor?

Kendalian Atom pada x86_64

x86_64 menyokong operasi atom berikut pada beregu, dilakukan menggunakan kunci- percuma arahan:

  • Muat
  • Simpan
  • Tambah
  • Tolak
  • Darab

Atomik Operasi Vektor dihidupkan x86_64

Malangnya, tiada cara untuk menjamin keatoman 128b atau 256b storan atau pemuatan vektor merentasi sistem koheren cache. Walau bagaimanapun, untuk vektor sejajar, anda boleh menggunakan beban vektor dan menyimpan dengan selamat pada tatasusunan berganda yang dikongsi tanpa risiko koyak.

Jika beban atom 16B diperlukan, satu-satunya pilihan anda ialah menggunakan kunci cmpxchg16b dengan dikehendaki=jangkaan. jika ia berjaya, ia menggantikan nilai sedia ada dengan dirinya sendiri. Jika ia gagal, anda mendapat kandungan lama. Ambil perhatian bahawa "beban" ini rosak pada memori baca sahaja, jadi berhati-hati apabila menghantar penunjuk kepada fungsi yang melaksanakan operasi ini.

Stor atom 16B dan RMW boleh menggunakan kunci cmpxchg16b dengan cara yang jelas. Ini menjadikan kedai tulen jauh lebih mahal daripada kedai vektor biasa, terutamanya dengan berbilang percubaan semula cmpxchg16b. Walau bagaimanapun, RMW atom sudah mahal.

Batasan Operasi Vektor Atom

  • atom<__m128d> akan menjadi perlahan walaupun untuk operasi baca sahaja atau tulis sahaja kerana penggunaan cmpxchg16b.
  • atom<__m256d> tidak boleh bebas kunci.
  • alignas(64) atom shared_buffer[1024]; akan membenarkan auto-vektorisasi, tetapi pengkompil tidak menjana asm yang cekap untuk ini.

Membaca dan Mengemas kini Objek 16B Secara Atom

Anda boleh mengemas kini objek 16B secara atom tetapi membaca bahagian 8B secara berasingan. Walau bagaimanapun, pengkompil tidak menyediakan cara yang bersih untuk menyatakan ini, dan inline cmpxchg16b tidak boleh dipercayai kerana pertimbangan berterusan oleh pembangun pengkompil.

Atas ialah kandungan terperinci Adakah x86_64 Menyokong Operasi Atom pada Vektor Beregu dan SSE/AVX?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan