Banyak algoritme internal ImageMagick berjalan secara multithread untuk memanfaatkan percepatan yang ditawarkan oleh chip prosesor multicore dan OpenMP. OpenMP adalah spesifikasi API untuk pemrograman paralel. Jika kompiler Anda mendukung direktif OpenMP (misalnya gcc, Visual Studio 2005), ImageMagick secara otomatis menyertakan dukungannya. Untuk memverifikasinya, cari fitur OpenMP pada ImageMagick dengan perintah berikut:
$ magick identify -version
Version: ImageMagick 7.0.10-50 2021-01-04 Q16 https://imagemagick.org
Copyright: © 1999-2021 ImageMagick Studio LLC
Features: OpenMP(4.5)
Dengan OpenMP diaktifkan, sebagian besar algoritme ImageMagick berjalan secara paralel pada semua core di sistem Anda. ImageMagick biasanya membagi pekerjaan sehingga setiap thread memproses 64 baris piksel. Seiring baris-baris selesai diproses, OpenMP menetapkan lagi kelompok baris piksel ke setiap thread hingga algoritme selesai. Misalnya, jika Anda memiliki sistem quad-core dan mencoba mengubah ukuran (resize) gambar, proses tersebut berjalan pada 4 core (8 jika hyperthreading diaktifkan).
Anda dapat lebih meningkatkan performa dengan mengurangi lock contention menggunakan pustaka (library) alokasi memori tcmalloc. Untuk mengaktifkannya, tambahkan --with-tcmalloc ke baris perintah configure saat Anda membangun (build) ImageMagick.
Bahaya eksekusi paralel
Perilaku pada lingkungan paralel bisa sulit diprediksi. Performa dapat bergantung pada sejumlah faktor, termasuk kompiler, versi pustaka OpenMP, jenis prosesor, jumlah core, jumlah memori, apakah hyperthreading diaktifkan, kombinasi aplikasi yang berjalan bersamaan dengan ImageMagick, atau algoritme pemrosesan gambar tertentu yang Anda gunakan. Satu-satunya cara untuk memastikan performa optimal, dari segi jumlah thread, adalah dengan melakukan benchmark. ImageMagick menyertakan pengujian thread secara bertahap saat melakukan benchmark perintah, dan mengembalikan waktu yang berlalu serta efisiensi untuk satu thread atau lebih. Ini dapat membantu Anda mengetahui berapa banyak thread yang paling efisien di lingkungan Anda. Berikut contoh benchmark untuk thread 1-8:
$ magick -bench 40 model.png -sharpen 0x1 null:
Performance[1]: 40i 0.712ips 1.000e 14.000u 0:14.040
Performance[2]: 40i 1.362ips 0.657e 14.550u 0:07.340
Performance[3]: 40i 2.033ips 0.741e 14.530u 0:04.920
Performance[4]: 40i 2.667ips 0.789e 14.590u 0:03.750
Performance[5]: 40i 3.236ips 0.820e 14.970u 0:03.090
Performance[6]: 40i 3.802ips 0.842e 15.280u 0:02.630
Performance[7]: 40i 4.274ips 0.857e 15.540u 0:02.340
Performance[8]: 40i 4.831ips 0.872e 15.680u 0:02.070
Performa yang lebih baik berkorelasi dengan nilai IPS (iterasi per detik) yang lebih tinggi. Pada contoh ini, 8 core adalah yang paling optimal. Namun, dalam kasus tertentu, mengatur jumlah thread menjadi 1 (misalnya -limit thread 1) atau menonaktifkan OpenMP sepenuhnya bisa jadi lebih optimal. Untuk menonaktifkan fitur ini, tambahkan --disable-openmp ke baris perintah skrip configure Anda, lalu bangun ulang dan instal ulang ImageMagick.