Tuesday 3 October 2017

SUPERSCALAR ARCHITECTURE

Overview Supersclalar Architecture (SSA)           
            Superscalar Architecture (SSA) yang biasa dikenal dengan arsitektur superskalar merupakan arsitektur dari suatu komputer (processor) yang memungkinkan eksekusi dilakukan secara bersamaan (paralel) dalam satu siklus dengan memanfaatkan teknik pipelining. Hal ini menjadikan  setiap pipleine terdiri dari beberapa stage, sehingga setiap pipeline dapat menangani beberapa insruksi dalam satu waktu. Dalam hal ini, sebuah processor superscalar memanfaatkan apa yang  dikenal dengan instruction level parallelism, yang mengacu pada sejauh mana instruksi dari sebuah program dapat dieksekusi secara paralel. Arsitektur superskalar diperlukan untuk meningkatkan kinerja eksekusi dari suatu instruksi yang bersifat skalar. Maksud dari instruksi yang bersifat skalar adalah perintah/ instruksi tersebut dapat dieksekusi dengan menggunakan variabel yang sederhana, seperti variabel integer (bilangan bulat, bilangan yang tidak memiliki pecahan). Disisi lain, beberapa CPU juga memiliki kemampuan untuk mengolah data bertipe floating point (bilangan berkoma). Teknik superscalar terkait dengan mengidentifikasi beberapa karakteristik :
ñ  Instruksi yang dikeluarkan dari aliran instruksi berurutan.
ñ  Processor memeriksa secara dinamik dependensi data antara instruksi saat berjalan.
ñ  Processor menerima beberapa instruksi per clock cycle.

Berikut ini adalah gambaran dari arsitektur superscalar  :
Superscalar Architecture
           

            Dalam klasifikasi Flynn, sebuah superscalar single core diklasifikasikan sebagai SISD (Single Instruction Single Data) sedangkan dalam sebuah superscalar multi core diklasifikasikan sebagai MIMD (Multiple Instruction Multiple Data).
            Sebuah processor yang berjalan dengan superscalar akan menjalankan dua instruksi secara bersamaan dalam satu stage pipeline. Sehingga bila digambarkan dengan gambar, maka akan terlihat seperti berikut.
Simple superscalar pipeline
           
            Gambar tersebut menjelaskan bahwa dua instruksi dapat berjalan dalam satu waktu, instruksi ini meliputi IF (Instruction Fetch), ID(Instruction Decode), EX(Execute), MEM(Memory Access) dan WB(Register Write Back),  dua instruksi dapat diselesaikan dalam satu clock cycle.
           
Sejarah Superscalar Architecture
Sejarah arsitektur superskalar yang pertama yakni adanya Seymour Cray CDC 6600 pada tahun 1965 yang sering disebut sebagai desain superscalar yang pertama. Lalu pada tahun 1988 Intel mengeluarkan Intel i960CA dan AMD memproduksi AMD 29000-series 29050 pada tahun 1990 membuat sejarah dengan memproduksi microprocessor yang komersial. Selanjutnya pada tahun 1998 Intel melalui P5 Pentium mengeluarkan sebuah processor arsitektur superscalar yang pertama pada processor seri x86. Disisi lain Nx586, p6 Pentium Pro dan AMD K5 termasuk diantara processor dengan mengubah instruksi pada x86 menjadi instruksi microcode yang dinamis seperti urutan operasi mikro sebelum eksekusi aktual pada mikroarsitektur superscalar.


SUPERSCALAR VERSUS SUPERPIPELINED

Superscalar sebuah uniprocessor yang dapat mengeksekusi dua atau lebih operasi scalar dalam bentuk paralel. Superpipeline cara yang diguakan untuk melakukan sejumlah kerja secara bersamaan tetapi dalam tahap yang berbeda yang dialirkan secara kontinu pada unit pemrosesan, dengan cara ini unit pemrosesan selalu berkerja.
Super-pipelined Execution  

Super-pipelined Execution
Super-Scalar Execution

Super-Scalar Execution

Perbandingan Eksekusi Instruksi Antara Superscalar dan Superpipeline


DESIGN ISSUES

            Ada beberapa isu yang dapat dibahas dalam Superscalar Architecture ini, beberapa isu tersebut diantaranya :

Instruction Level Parallelism dan Machine Parallelism
            Instruction Level Parallelism dapat dilakukan ketika instruksi yang berjalan tidak bergantung pada eksekusi yang lain, sehingga dapat berjalan secara paralel dengan tumpang tindih. Tingkat level paralelisme dari suatu instruksi bergantung kepada frekuensi dari dependensi data dan dependensi suatu prosedur dalam kode program. Faktor ini bergantung pada arsitektur instruksi tersebut dan bergantung pada aplikasinya. Sehingga instruction level parallelism juga dipengaruhi dari latensi suatu operasi, yakni waktu yang diperlukan untuk mengeksekusi suatu instruksi yang tersisa untuk instruksi selanjutnya. Latensi ditentukan dari berapa lama delay yang disebabkan karena dependensi suatu data atau prosedur.
Instruksi 1                               Instruksi 2
Load R1 R2                       Add R3 R3, 1
Add R3 R3, 1            Add R4 R3, R2
Add R4 R4, R2                 Store [R4] R0

 
 Gambaran Instruction Level Parallelism
           
Gambaran sebelah kiri merupakan penggambaran analogi instruksi yang dapat dijalankan secara paralel. Sedangkan pada gambaran sebelah kanan instruksi tidak berjalan independen, karena ada instruksi yang berhubungan dengan instruksi yang lainnya. 
Machine Paralelism adalah ukuran dari kemampuan processor untuk mengambil keuntungan dari adanya instruksi yang dijalankan secara parallel. Sehingga machine paralelism ditentukan oleh jumlah instruksi yang dapat diambil (fetch) dan dijalankan pada waktu yang sama (banyaknya pipeline yang paralel) dan kecepatan serta kecanggihan suatu prosesor untuk menemukan instruksi yang independen.

Instruction Issue Policy
Secara umum instruction issue policy dikelompokan ke dalam 3 kategori:
  1. In-order issue with in-order completion (IOI with IOC)
  2. In-order issue with out-of-order completion (IOI with OOC)
  3. Out-of-order issue with out-of-order completion (OOC with OOC)
In-Order Issue With In-Order Completion
Instruction issue policy paling sederhana, yakni dengan mengeksekusi instruksi secara sekuen (in-order issue) dan menuliskannya dalam order yang sama (in-order completion).
Decode

Execute

Write

Cycle
I1
I2








1
I3
I4

I1
I2





2
I3
I4

I1



I1
I2

3

I4



I3




4
I5
I6



I4




5

I6


I5


I3
I4

6




I6





7







I5
I6

8
In-order issue with in-order completion

Pada gambar diatas, diberikan contoh  In-order issue with in-order completion, dengan asumsi bahwa superscalar pipeline dapat melakukan fetch dan decode 2 buah instruksi dalam satu waktu, memiliki 3 functional unit terpisah (misal: 2 integer aritmatika, dan 1 floating-point aritmatika), dan memiliki 2 instance write-back (WB) pipeline stage. Contoh di atas diasumsikan harus melakukan 6 instruksi di bawah ini:
1. I1 membutuhkan 2 cycle untuk eksekusi
2. I3 dan I4 konflik untuk unit fungsi yang sama
3. I5 bergantung pada nilai yang dihasilkan oleh I4
4. I5 dan I6 konflik untuk sebuah unit fungsi
Fetch instruksi dengan berpasangan dan diteruskan untuk dilakukan decode. Dikarenakan fetching nya dilakukan berpasangan, maka 2 instruksi berikutnya harus mengunggu sampai 2 pasangan yang sedang di decode pada pipeline stage kosong. Untuk meyakinkan in-order completion adalah dengan terjadinya konfilk pada unit fungsi yang sama atau ketika unit fungsi membutuhkan lebih dari 1 cycle untuk mejenerate sebuah hasil.
Pada contoh di atas waktu  yang dibutuhkan dimulai dari decode instruksi pertama sampai hasil akhir adalah 8 cycles.

In-Order Issue With Out-Of-Order Completion
Out-of-order completion digunakan dalam prosesor RISC scalar untuk memperbaiki kinerja pada instruksi yang membutuhkan multiple cycle. Gambar 4 mengilustrasikan penggunaan IOI with IOC pada prosesor superscalar. Instruksi I2 diperbolehkan untuk menjalankan sampai selesai sebelum I1. Hal ini memungkinkan I3 akan selesai sebelum I2, dengan adanya penghematan satu cycle.
Dengan out-of-order completion, sejumlah instruksi memungkinkan dalam stage eksekusi pada waktu yang sama, sampai tingkat maksimum machine parallelism seluruh unit fungsi. Issue instruksi terhenti oleh adanya konflik sumberdaya, kebergantungan data, atau kebergantungan dependensi.
Di bawah ini code fragment yang mengilustrasikan kebergantungan (op merepresentasikan operasi apapun).
I1: R3 ← R3 op R5
I2: R4 ← R3 + 1
I3: R3 ← R5 + 1
I4: R7 ← R3 op R4
Instruksi I2 tidak dapat dieksekusi sebelum instruksi I1, karena instruksi I2 membutuhkan nilai yang dihasilkan oleh R3 (pada instruksi I1).
I4 harus menunggu sampai I3 selesai dieksekusi, karena membutuhkan nilai yang dihasilkan oleh instruksi I3.

Apakah I1 dan I3 memiliki relasi ? Dalam hal ini, tidak ada kebergantungan data antara I1 dan I3. Jika I3 selesai sebelum I1, maka kesalahan nilai yang dihasilkan oleh I3 akan di fetch pada eksekusi instruksi I4. Maka dari itu, jika I3 selesai sebelum I1, maka I3 harus menghasilkan nilai yang benar (Untuk meyakinkan hal ini, instruksi ketiga harus dihentikan, sehingga instruksi I1 selesai dan menimpa nilai I3 oleh nilai I1 – yang membutuhkan waktu lama untuk sampai selesai)

Decode

Execute

Write

Cycle
I1
I2








1
I3
I4

I1
I2





2

I4

I1

I3

I2


3
I5
I6



I4

I1
I3

4

I6


I5


I4


5




I6


I5


6







I6


7
In-order issue with out-of-order completion

Out-Of-Order Issue With Out-Of-Order Completion
            Kelemahan dari IOI yakni prosesor hanya akan men-decode instruksi sampai titik dependensi atau konflik (tidak adanya tambahan instruksi decode sampai konflik teratasi) yang akibatnya prosesor tidak bisa melihat instruksi lain yang independent (bisa di proses).
Untuk menutupi kekurangan di atas, maka OOI memisahkan antara decode dan eksekusi instruksi, dikenal dengan konsep instruction window. Dengan konsep/organisasi ini, setelah prosesor selesai melakukan instruksi decode, instruksi ditempatkan di instruction window, selama buffer (instruction window) tidak penuh, prosesor dapat terus fetch dan decode instruksi baru. Instruksi-instruksi yang ada di buffer (instruction window) akan di eksekusi ketika unit fungsi di pipa stage available.
Decode

Window

Execute

Write

Cycle
I1
I2










1
I3
I4

I1, I2

I1
I2





2
I5
I6

I3,I4

I1

I3

I2


3



I4, I5, I6


I6
I4

I1
I3

4



I5


I5


I4
I6

5









I5


6
Out-of-order issue with out-of--order completion
           
Pada gambar di atas mengilustrasikan bahwa untuk setiap masing-masing 3 cycle pertama, 2 instruksi di fetch dan di decode dalam stage. Pada setiap cycle, 2 instruksi bergerak dari decode ke buffer (instruction window). Dalam contoh ini memungkinkan untuk mengeluarkan I6 dulu dibandingkan I5 (Ingat bahwa I5 bergantung dari I4, tapi tidak untuk I6). Dengan demikian satu cycle menyimpan ke execute dan write-back stages.

Register Renaming
            Dengan adanya konsep OOI with OOC akan memungkinkan adanya dependensi WAW (Write After Write) dan WAR (Write After Read). Dependensi ini muncul akibat dari nilai di register yang mungkin tidak lagi mencerminkan urutan nilai yang ditentukan oleh aliran program.
Register renaming menjadi salah satu metode untuk mengatasi konflik duplikasi sumber daya, dimana register dialokasikan dinamis oleh hardware prosesor, dan register berhubungan dengan nilai-nilai yang dibutuhkan oleh isntruksi.

Machine Parallelism
            Pada teori sebelumnya terdapat 3 teknik hardware yang dapat digunakan dalam upaya meningkatkan kinerja prosesor superscalar, yakni: duplikasi sumber daya, OOI, dan renaming. Salah satu studi yang memaparkan mengenai hubungan antara teknik-teknik hardware di atas telah dilaporkan dalam [SMIT89]. Studi ini memanfaatkan pemodelan sebuah mesin dengan karakteristik R2K MIPS.

Kecepatan berbagai jenis organisasi mesin tanpa Procedural Dependencies

Gambar di atas menunjukan bahwa dengan menggunakan procedural dependencies akan meningkatkan kinerja prosesor scalar. Sumbu Y mewakili kecepatan mesin superscalar, sumbu X mewakili 4 alternatif organisasi prosesor. Untuk konfigurasi mesin pertama (base) tidak ada duplikasi pada unit fungsi, konfigurasi mesin kedua (+ld/st) dilakukan duplikasi load/store unit fungsi, konfigurasi mesin ketiga (+alu) dilakukan duplikasi ALU, dan konfigurasi keempat (+both) dilakukan duplikasi load/store dan ALU. Untuk masing-masing grafik hasil dari instruction window berukuran 8, 16, 32 instruksi.
Dari kedua grafik di atas dapat disimpulkan sebagai berikut: untuk grafik tanpa adanya register renaming ada sedikit perbaikan kinerja, akan tetapi cost tinggi. Untuk grafik sebelah kiri dengan register renaming adanya peningkatan kinerja yang signifikan bila dibandingkan dengan tanpa menggunakan teknik register renaming.

Branch Prediction
Mesin pipeline berkinerja tinggi apapun selalu ada issue dengan branch. Akan tetapi dengan adanya teknologi superscalar masalah branch sedikit teratasi. Alasannya adalah instruksi ganda pada saat eksekusi membutuhkan slot delay, dan superscalar memiliki teknik branch prediction. Contoh prosesor scalar yang menggunakan branch prediction: PowerPC601 (static branch prediction), PowerPC620 dan Pentium4 (dynamic branch prediction yang mengacu pada analisa branch history).

Superscalar Execution
            Pada gambar di bawah ini mengilustrasikan sebuah program yang akan dieksekusi terdiri dari instruksi-instruksi linier yang berurutan. Program ini termasuk static program yang dibuat oleh programmer atau degenerate oleh compiler. Proses pertama melakukan fetch terhadap beberap instruksi (termasuk di dalamnya branch prediction – khusus untuk bentuk instruksi dinamis). Proses berikutnya, prosesor mengirimkan instruksi-instruksi yang di fetch ke window of execution. Dalam fase ini instruksi tidak lagi dalam bentuk sekuensial, akan tetapi bentuk instruksi sdh disesuaikan dengan data dependensi yang benar. Hal ini dilakukan untuk memudahkan prosesor melakukan kinerja. Yang pada akhirnya instruksi-instruksi tadi dikembalikan ke dalam bentuk sekuensial dan hasilnya dicatat. 

Proses superscalar secara konsep

Langkah terakhir commiting atau retiring, hal ini diperlukan dikarenakan alas an-alasan berikut ini: karena menggunakan konsep parallel, multiple pipeline, memungkinkan instruksi selesai dalam urutan yang berbeda. Dan penggunaan branch prediction dan speculative execution yang berarti bahwa beberapa instruksi dapat menyelesaikan eksekusi dan kemudian harus ditinggalkan dikarenakan branch yang diwakili tidak diambil. Oleh karena itu penyimpanan permanen dan program-visible register tidak dapat diperbarui seketika. Hasil harus disimpan di beberapa penyimpanan sementara yang digunakan oleh instruksi lalu dibuat permanen ketika telah ditentukan bahwa model sekuensial akan mengeksekusi intruksi.

Superscalar Implementation
            Pendekatan konsep superscalar pada prosesor adalah diperlukan, berikut key elements yang berlaku:
  • Instruction fetch, digunakan untuk mengambil beberapa instruksi. Unit fungsi ini membutuhkan penggunaan multiple pipeline untuk fetch dan decode stage, dan logika branch prediction.
  • Logic, digunakan untuk kebenaran dependensi yang melibatkan nilai-nilai register dan mekanisme untuk mengkomunikasikan nilai-nilai tersebut harus dikasih kemana selama eksekusi berlangsung.
  • Mekanisme dalam konsep parallel yakni initiating, issuing, multiple instruction.
  • Sumber daya, untuk eksekusi parallel dari instruksi ganda (termasuk juga unit fungsi pipeline ganda dan hirarki memori) yang mampu secara simultan melayani dalam memberikan petunjuk memori ganda.
  • Mekanisme untuk committing process state dalam urutan yang benar.


SUPERSCALAR PROCESSOR
 Pentium 4
Berikut ini merupakan block diagram dari Pentium 4, diagram tersebut yang akan menggambarkan operasi yang berjalan pada prosesor tersebut.
Pentium 4 Block Diagram


Apabila disimpulkan maka operasi yang berjalan pada Pentium 4, menjadi seperti berikut :
  • Mengambil instruksi ke dalam memori dari program
  • Menerjemahkan instruksi menjadi satu atau lebih instruksi RISC
  • Mengekseksusi micro-ops pada superscalar pipeline
  • Menyimpan hasil dari micro-ops ke register
  • Di luar CISC shell di bagian dalam RISC core
  • Bagian dalam RISC core terdapat pipeline yang terdiri minimal 20 stage

Berikut ini adalah pipeline yang berjalan pada prosesor Pentium 4. Instruksi pada pipeline tersebut digambarkan pula pada operasi pipeline yang digambarkan pada gambar selanjutnya.
Pentium 4 Pipeline dan Pentium 4 Pipeline Operation




ARM Cortex A8
            Prosesor ARM merupakan salah satu prosesor yang mengimplementasikan teknik superscalar dalam instruksi pipelinenya. ARM Cortex A8 merupakan salah satu contoh desain superscalar prosesor dengan mengimplementasikan RISC (Reduced Instruction Set Computer). Berikut ini adalah beberapa informasi lainnya mengenai prosesor ARM Cortex A8.
  • ARM mengacu ke Cortex-A8 sebagai prosesor aplikasi
  • Prosesor embedded yang menjalankan sistem operasi kompleks
    • Wireless
    • Mobile phones
  • Terdiri dari 13 stage pipeline, tetap menjaga daya yang diperlukan ke batas minimum
  • Memisahkan SIMD (single-instruction-multiple-data) unit, 10 stage pipeline
Berikut ini merupakan block diagram ARM Cortex yang ditunjukkan pada gambar dibawah ini :
ARM Cortex Block Diagram

Instruksi yang berjalan pada pipeline ARM Cortex ini berlangsung dalam beberapa tahapan. Berikut ini adalah tahapan instruksi tersebut :
1. Instruction Fetch Unit
  • Memprediksi aliran instruksi
  • Mengambil instruksi dari cache instruksi L1
  • Bisa sampai empat instruksi per cycle
  • Menuju ke buffer untuk men-decode pipeline
  • Mengambil unit dari cache instruksi L1
  • Menspekulasi pengambilan instruksi
  • Percabangan atau instruksi pengecualian menyebabkan pembuangan data pipeline
  • Stage:
  • Generasi alamat F0 menghasilkan alamat virtual
    • Biasanya berikutnya berurutan
    • Bisa juga sebagai alamat target pencabangan
  • F1 digunakan untuk mengambil instruksi dari cache instruksi L1
    • Secara paralel mengambil alamat untuk mengakses array prediksi pencabangan
  • Instruksi data F3 disimpan dalam antrian instruksi
    • Jika prediksi pencabangan, alamat target baru dikirim ke alamat unit pembangkit
  • Dua tingkat global history cabang prediktor
    • Branch Target Buffer (BTB) dan Global History Buffer (GHB)
  • Mengembalikan tumpukan untuk memprediksi alamat kembali dari subroutine
  • Dapat mengambil dan mengantri sampai 12 instruksi
  • Isue dua instruksi pada satu waktu
2. Instruction Decode Unit
  • Menerjemahkan dan mengurutkan semua instruksi
  • Dual struktur pipeline, pipe0 dan pipe1
  • Dua instruksi dapat berjalan pada satu waktu
  • Pipe0 berisi instruksi yang lebih lama dari program order
  • Jika instruksi pada pipe0 tidak dapat diselesaikan maka pipe1 pun tidak bisa
  • Pengerjaan instruksi berurutan
  • Hasil ditulis kembali ke file register pada akhir eksekusi pipeline

Proses Fetch Decode pada ARM Cortex A8 Integer Pipeline


3. Instruction Processing Stages
  • Instruksi thumb D0 didekompresi dan dilakukan pen-decode pada awal dikerjakan
  • Instruksi D1 di-decode selesai
  • Instruksi D2 ditulis dan dibaca ulang pada antrian
  • D3 terdiri dari instruksi logika penjadwalan
    • Pemeriksaan hazard
  • D4 di akhir melakukan decode untuk mengontrol sinyal untuk mengeksekusi integer pada unit pengisian/penyimpanan
4. Integer Execution Unit
  • Dua simetris pipa ALU, generator alamat untuk menyimpan dan mengisi instruksi
  • Pipeline stage:
  • E0 mengakses file register
  • Bisa sampai enam register untuk dua instruksi
  • Penggantian barrel E1 jika dibutuhkan
  • E2 fungsi ALU
  • E3 jika dibutuhkan, melengkapi aritmatika saturasi
  • E4 mengubah kontrol aliran yang diprioritaskan dan yang diproses
  • E5 hasil ditulis kembali ke file register
5. Load/Store Pipeline
  • Paralel ke pipeline integer
  • E1 alamat memory dihasilkan dari basis dan index register
  • E2 alamat diterapkan pada array cache
  • E3 mengisi, data dikembalikan dan diformat
  • E3 menyimpan, data telah diformat dan siap ditulis ke dalam cache
  • E4 memperbarui cache L2 jika diperlukan
  • E5 hasil ditulis ke file register

Berikut ini adalah instruksi yang berjalan  pada SIMD dan Floating-Point Pipeline, sehingga disimpulkan menjadi poin-poin sebagai berikut dan digambarkan pada gambar berikutnya.
  • SIMD dan instruksi floating-point dapat melewati integer pipeline
  • Diproses terpisah pada 10-stage pipeline
  • NEON unit
  • Menangani instruksi SIMD yang dikemas
  • Menyediakan dua tipe dari floating-point
Floating Point Pipeline

2 comments: