Assembly Language & x86 Low-Level Systems Programming · Pelajaran

Vektorisasi Kode dengan SIMD

Temukan teknik untuk mengoptimalkan kinerja kode dengan melakukan vektorisasi operasi menggunakan instruksi SSE/AVX untuk tugas yang datanya diproses secara paralel.

Pelajaran 3 dari 411 langkah

Vektorisasi Kode dengan SIMD adalah pelajaran Assembly Language & x86 Low-Level Systems Programming gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Assembly Language & x86 Low-Level Systems Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Assembly Language & x86 Low-Level Systems Programming mencakup 4 pelajaran total.

Bagian dari pelajaran ini belum diterjemahkan dan ditampilkan dalam bahasa Inggris.

Intro to Vectorization

Welcome to the final lesson on SIMD! We've learned about SSE/AVX registers and instructions. Now, let's put it all together to vectorize code.

Vectorization is a compiler optimization or manual coding technique that transforms loops to perform operations on multiple data elements simultaneously, rather than one at a time.

Why Vectorize? SIMD Power

Imagine adding two lists of numbers. A traditional (scalar) approach adds one pair at a time. Vectorization, using SIMD, lets you add multiple pairs in a single instruction.

  • Scalar: A[0]+B[0], then A[1]+B[1], etc.
  • SIMD: (A[0], A[1], A[2], A[3]) + (B[0], B[1], B[2], B[3]) all at once!

This parallel processing dramatically speeds up repetitive tasks on large datasets.

Data Alignment Matters

For optimal SIMD performance, your data should be aligned in memory. This means the starting address of your data block should be a multiple of the vector size (e.g., 16 bytes for SSE, 32 bytes for AVX).

  • Aligned Access: Faster, uses instructions like MOVAPS.
  • Unaligned Access: Slower, uses instructions like MOVUPS, as the CPU needs extra work to fetch data.

Proper alignment helps the CPU fetch data more efficiently, avoiding performance penalties.

Loading Vector Data

To work with data in SIMD registers, you first need to load it from memory. Here are common instructions for single-precision floats (PS):

  • MOVAPS XMM0, [mem]: Moves 4 aligned single-precision floats from memory to XMM0.
  • MOVUPS XMM0, [mem]: Moves 4 unaligned single-precision floats from memory to XMM0.

Always try to use MOVAPS if your data is guaranteed to be aligned for better performance.

Performing Vector Math

Once data is in SIMD registers, you can perform operations on all elements simultaneously. For example, to add two vectors of single-precision floats:

  • ADDPS XMM0, XMM1: Adds corresponding packed single-precision floats in XMM1 to XMM0. The result is stored in XMM0.

This single instruction performs four separate additions in parallel!

Storing Vector Results

After processing data in SIMD registers, you'll want to store the results back to memory. Similar to loading, there are aligned and unaligned store instructions:

  • MOVAPS [mem], XMM0: Stores 4 aligned single-precision floats from XMM0 to memory.
  • MOVUPS [mem], XMM0: Stores 4 unaligned single-precision floats from XMM0 to memory.

Again, prioritize MOVAPS for storing if your destination memory is aligned.

Vectorizing an Array Sum

Let's see a simple example of adding two arrays of single-precision floats using SSE instructions. This program adds array1 and array2 and stores the result in result.

We process 4 floats at a time in a loop-like fashion, moving 16 bytes (4 floats) per step.

section .data
    ; Define 8 single-precision floats (4 bytes each), aligned to 16 bytes
    ; 'dd' defines a doubleword (4 bytes), suitable for floats
    array1: align 16
        dd 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0
    array2: align 16
        dd 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0
    result: align 16
        dd 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0

section .text
    global _start

_start:
    ; Process the first 4 floats (16 bytes)
    movaps xmm0, [array1]    ; Load 1.0, 2.0, 3.0, 4.0 into xmm0
    movaps xmm1, [array2]    ; Load 8.0, 7.0, 6.0, 5.0 into xmm1
    addps  xmm0, xmm1        ; Add packed floats: (9.0, 9.0, 9.0, 9.0)
    movaps [result], xmm0    ; Store result to result[0-3]

    ; Process the next 4 floats (16 bytes offset)
    movaps xmm0, [array1 + 16] ; Load 5.0, 6.0, 7.0, 8.0 into xmm0
    movaps xmm1, [array2 + 16] ; Load 4.0, 3.0, 2.0, 1.0 into xmm1
    addps  xmm0, xmm1        ; Add packed floats: (9.0, 9.0, 9.0, 9.0)
    movaps [result + 16], xmm0 ; Store result to result[4-7]

    ; Exit program (Linux specific system call)
    mov eax, 1               ; sys_exit system call number
    xor ebx, ebx             ; exit code 0
    int 0x80                 ; Call kernel

Other Common SIMD Ops

Besides ADDPS, SSE/AVX provide a wide range of instructions for various packed operations:

  • SUBPS: Subtract packed single-precision floats.
  • MULPS: Multiply packed single-precision floats.
  • DIVPS: Divide packed single-precision floats.
  • ANDPS, ORPS, XORPS: Bitwise logical operations on packed floats.
  • Comparison instructions (e.g., CMPPS): Compare packed floats.

The key is that they all operate on multiple data items simultaneously.

When to Vectorize

Vectorization is a powerful optimization, but it's not always necessary or beneficial. Consider these points:

  • Large Datasets: Most effective for loops processing many elements.
  • Repetitive Operations: Ideal for identical operations applied to many data items.
  • Data Layout: Works best with contiguous, aligned data.
  • Overhead: Small loops might incur more overhead from setting up vector registers than the speedup provides.

Compilers can often auto-vectorize, but manual vectorization gives you fine-grained control.

Quick Check: Vectorization

Which of the following are key benefits of vectorizing code using SIMD instructions?

Recap: SIMD Power

Great job! You've now learned how to apply SSE/AVX instructions to vectorize your code.

  • Vectorization performs operations on multiple data items simultaneously.
  • Proper data alignment is crucial for optimal performance.
  • Instructions like MOVAPS, ADDPS, and MOVAPS are used to load, process, and store packed data.
  • Vectorization is highly effective for repetitive operations on large, contiguous datasets.

This powerful technique allows you to unlock significant performance gains in your x86 assembly programs. Keep practicing!

Gratis untuk memulai

Belajar Assembly dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
12
Pelajaran
48

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Vektorisasi Kode dengan SIMD” gratis?

Ya — teks lengkap “Vektorisasi Kode dengan SIMD” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Assembly Language & x86 Low-Level Systems Programming, upgrade ke CoddyKit PRO. Kursus Assembly Language & x86 Low-Level Systems Programming mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Vektorisasi Kode dengan SIMD”?

Temukan teknik untuk mengoptimalkan kinerja kode dengan melakukan vektorisasi operasi menggunakan instruksi SSE/AVX untuk tugas yang datanya diproses secara paralel. Kamu berlatih Assembly Language & x86 Low-Level Systems Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Assembly Language & x86 Low-Level Systems Programming?

Tidak diperlukan pengalaman sebelumnya. Assembly Language & x86 Low-Level Systems Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Vektorisasi Kode dengan SIMD” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Assembly Language & x86 Low-Level Systems Programming ini?

Ya. Setiap pelajaran Assembly Language & x86 Low-Level Systems Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar Pemrograman FPU x87
  2. Pengenalan Set Instruksi SSE/AVX
  3. Vektorisasi Kode dengan SIMD
  4. Presisi Pecahan, Pembulatan, dan Pengecualian
← Kembali ke Assembly Language & x86 Low-Level Systems Programming