Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memuatkan 8 Aksara daripada Memori ke dalam Pembolehubah __m256 sebagai Terapung Ketepatan Tunggal Berbungkus Menggunakan AVX2?

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

DDD
DDDasal
2024-10-31 21:43:02780semak imbas

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

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>

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!

Kenyataan:
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