Skip to content

Arbath/rust-parallel-looping

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Untuk Apa Kode Ini?

Singkatnya, kode ini bertujuan untuk menghitung total penjumlahan semua angka dari 1 sampai 1 triliun (yaitu, 1 + 2 + 3 + ... + 1.000.000.000.000).

Karena ini adalah perhitungan yang sangat besar dan akan memakan waktu sangat lama jika dilakukan satu per satu, kode ini menggunakan pemrosesan paralel (memanfaatkan semua inti/core CPU) untuk mempercepatnya secara drastis.

Selain itu, kode ini juga:

  • Menampilkan progress bar yang informatif di terminal.
  • Mengukur dan menampilkan total waktu yang dibutuhkan untuk perhitungan.

Bagaimana Cara Kerjanya?

Kode ini bekerja dengan strategi "pecah dan taklukkan" (divide and conquer). Pekerjaan raksasa (menghitung 1 triliun angka) dipecah menjadi bagian-bagian kecil (chunks), lalu setiap bagian dikerjakan secara bersamaan (paralel).

Berikut adalah rincian langkah kerjanya:

1. Persiapan dan Library

Kode ini mengimpor tiga crate (library) eksternal:

2. Pembagian Tugas (Chunking)

Di dalam fungsi main, hal pertama yang dilakukan adalah menentukan ukuran pekerjaan:

3. Inisialisasi Progress Bar

4. Perhitungan Paralel (Inti Logika)

Di sinilah keajaiban rayon terjadi:

  • let sum: u128 = (0..num_chunks): Ini membuat iterator (penghitung) dari 0 hingga 99 (total 100 chunk).
  • .into_par_iter(): Ini adalah perintah kuncinya. rayon mengubah iterator standar tadi menjadi iterator paralel. Ini berarti loop berikutnya akan dijalankan secara bersamaan di thread dan core CPU yang berbeda.
  • .map(|chunk_idx| { ... }): Blok kode ini akan dieksekusi untuk setiap chunk_idx (0, 1, 2, ..., 99), kemungkinan besar di waktu yang bersamaan.
    • let start_i = ... dan let end_i = ...: Menghitung angka awal dan akhir untuk chunk ini.
      • Core 1 mungkin mengambil chunk_idx = 0, menghitung start_i = 1 dan end_i = 10_000_000_000.
      • Core 2 mungkin mengambil chunk_idx = 1, menghitung start_i = 10_000_000_001 dan end_i = 20_000_000_000.
      • Core 3 mungkin mengambil chunk_idx = 2, ... dan seterusnya.
    • for i in start_i..=end_i { chunk_sum += i; }: Ini adalah pekerjaan utamanya. Setiap core menjumlahkan angka-angka hanya di dalam jangkauan chunk-nya sendiri.
    • pb.inc(1);: Setelah satu chunk selesai dihitung, progress bar akan bertambah 1.
    • chunk_sum: Mengembalikan hasil penjumlahan parsial dari chunk tersebut.

5. Penggabungan Hasil dan Laporan

  • .sum(): Setelah semua chunk selesai diproses secara paralel, metode .sum() dari rayon akan mengambil semua hasil chunk_sum (dari semua core) dan menjumlahkan mereka semua menjadi satu nilai total akhir.
  • pb.finish_with_message(...): Menghentikan progress bar.
  • println!(...): Mencetak hasil total penjumlahan dan total waktu eksekusi ke layar.

6. Hasil Pengujian

Pengujian dilakukan pada 2 komputer berbeda keduanya menggunakan 100% cpu core mereka.

Intel core i5 1235u 10 core 12 thread (Windows)

  • CPU Utilization : Intel core i5 1235u cpu
  • Result : Intel core i5 1235u result

Intel xeon E5 2680 v4 14 core 28 thread (Ubuntu)

  • CPU Utilization : Intel core i5 1235u cpu

  • Result : Intel xeon E5 2680 v4 result

Ingin mencobaya sendiri?

Jika ingin mencoba silahkan clone repository lalu compile rust dengan optimasi cargo build --release atau download file binary dibawah ini dan jalankan di terminal.

About

Experiment loop parallel 101% cpu bound with rust

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages