Bagaimana untuk Memuatkan 8 Aksara daripada Memori ke dalam Pembolehubah __m256 sebagai Terapung Ketepatan Tunggal Berbungkus Menggunakan AVX2?

DDD
Lepaskan: 2024-10-31 21:43:02
asal
714 orang telah melayarinya

How to Load 8 Characters from Memory into an __m256 Variable as Packed Single Precision Floats Using AVX2?

Memuatkan 8 Aksara daripada Memori ke dalam Pembolehubah __m256 sebagai Terapung Ketepatan Tunggal Berbungkus

Dalam algoritma kabur Gaussian, pengoptimuman untuk pelaksanaan yang lebih pantas boleh dicapai dengan cekap memuatkan data ke dalam daftar vektor. Satu pengoptimuman sedemikian melibatkan menggantikan tatasusunan terapung dengan pembolehubah __m256. Artikel ini menyediakan penyelesaian optimum untuk tugas ini, memanfaatkan kuasa arahan AVX2.

Penyelesaian Menggunakan Arahan AVX2

Untuk memuatkan 8 aksara daripada memori ke dalam pembolehubah __m256 dengan berkesan menggunakan AVX2, arahan berikut disyorkan:

VPMOVZXBD  ymm0,  [rsi]  ; or SX to sign-extend  (Byte to DWord)
VCVTDQ2PS   ymm0, ymm0     ; convert to packed foat
Salin selepas log masuk

Spesifik Arahan

  • VPMOVZXBD: Sifar memanjangkan aksara 8-bit menjadi 32- integer bit dalam daftar ymm0.
  • VCVTDQ2PS: Menukar integer 32-bit kepada terapung ketepatan tunggal yang dibungkus, terus menyimpannya dalam ymm0.

Pengoptimuman Tambahan

Untuk mengoptimumkan lagi proses ini, pertimbangkan untuk menggunakan beban siaran untuk menyuap arahan VPMOVZXBD dan arahan Vpshufb untuk 64 bit tinggi. Strategi ini mengurangkan kiraan uop keseluruhan, meningkatkan kecekapan:

<code class="pseudocode">__m256 b = [float(new_image[x+7]), float(new_image[x+6]), ... , float(new_image[x])];
__m256 b = _mm256_broadcast_ss(&new_image[x])
_mm256_shuffle_epi8(b, _mm256_set1_epi8(0)); // fills upper 64 bits with zeroes
_mm256_cvtps_epu32(b); // convert to integers
_mm256_cvtepu32_ps(b); // convert back to floats</code>
Salin selepas log masuk

Elak Teknik Suboptimum

  • Elakkan menggunakan berbilang beban 128-bit atau 256-bit dan shuffle berikutnya, kerana ia mungkin menimbulkan kesesakan yang tidak perlu.
  • Jangan gunakan arahan VPMOVZXD diikuti dengan operan memori berasingan untuk VPMOVZX, kerana ia membawa kepada penjanaan kod yang tidak optimum.

Pertimbangan Tambahan

  • Pertimbangkan untuk menggunakan intrinsik yang selamat, jika ada, untuk mengelakkan potensi isu dengan penjajaran memori atau mengakses memori yang tidak dimulakan.
  • Gunakan _mm_loadl_epi64 atau _mm_loadu_si64 yang sesuai untuk mengelakkan intrinsik lebih banyak data daripada yang diperlukan atau menyebabkan kemungkinan kerosakan pembahagian.

Atas ialah kandungan terperinci Bagaimana untuk Memuatkan 8 Aksara daripada Memori ke dalam Pembolehubah __m256 sebagai Terapung Ketepatan Tunggal Berbungkus Menggunakan AVX2?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!