Apa struktur yang mendasari kinerja kode ilmiah?

11

Pertimbangkan dua komputer dengan konfigurasi perangkat keras dan perangkat lunak yang berbeda. Saat menjalankan kode Navier-Stokes serial yang sama persis pada setiap platform, diperlukan waktu x dan y untuk menjalankan satu iterasi untuk komputer 1 dan 2, secara berurutan. Dalam kasus ini, , adalah perbedaan waktu iterasi antara komputer 1 dan komputer 2.Δ=x-y

Apa yang bisa berdampak pada besarnya ? Salah satu kandidat yang jelas adalah CPU, pertanyaan utama saya adalah apakah ada faktor-faktor lain yang dapat mempengaruhi pada urutan yang sama dengan perbedaan perangkat keras antara CPU?ΔΔ

Osilasi Isopycnal
sumber
4
Tentu saja Anda hanya satu sampel. Anda juga harus menyelidiki bagaimana Δ tergantung pada ukuran dan struktur masalah. Kedua saya menyarankan untuk membuat profil kode, mencoba untuk membagi x dan y dalam jumlah kontribusi yang berbeda, dan menganalisis kinerja bagian-bagian kode yang berbeda sehubungan dengan konfigurasi hw dan sw. ΔΔxy
Stefano M
4
CISSE LINE MISSES . Itu hal pertama yang harus dipertimbangkan. Memori adalah faktor penghambat untuk banyak algoritma.
Pemburu Rusa

Jawaban:

13

Daftar ini sama sekali tidak lengkap, tetapi mudah-mudahan ukurannya akan memberi petunjuk tentang skala faktor yang mungkin. Saya berasumsi Anda sedang mengkompilasi kode dari sumber pada platform pilihan Anda.

Perangkat lunak

  • Kinerja Perpustakaan Standar
  • Lin Alg. Kinerja Perpustakaan (jika perangkat lunak tertaut ke perpustakaan luar)
  • Pilihan Kompiler
  • Optimalisasi Kompiler
  • Bendera Kompiler
  • Proses Latar Belakang (Dapat bervariasi secara signifikan jika OS berbeda)

Perangkat keras

CPU

  • Kecepatan jam
  • Arsitektur (instruksi yang sama dapat mengambil jumlah siklus yang berbeda pada arsitektur yang berbeda)
  • Ukuran Cache
  • Cache Latency
  • Kemampuan SIMD (Instruksi Tunggal, Banyak Data)

Penyimpanan

  • Jumlah Saluran
  • Kecepatan

HDD

  • Kecepatan Baca / Tulis (sebagian besar hanya penting untuk hasil penulisan, jadi ini tergantung pada seberapa sering Anda menulis keluaran ke file untuk pemecah NS, tetapi bisa penting untuk program lain yang melakukan hal-hal seperti pemrosesan gambar)

Ini semua mengabaikan trik kecil dan fitur produsen yang berbeda termasuk untuk memberikan chip mereka keunggulan di pasar. Namun yang besar adalah bahwa banyak perpustakaan aljabar linier jarang terikat memori. Mengalikan matriks jarang melibatkan banyak data bergerak tanpa banyak jepit yang sebenarnya.

Pelihat Godric
sumber
Saya akan menambahkan, ke CPU, baik jumlah core dan kemampuan SIMD-nya.
Pedro
@Pedro Saya meninggalkan core sejak pertanyaan mengatakan pemecah serial, tapi saya akan menambahkan SIMD. Terima kasih.
Godric Seer
1
@ GodricSeer Saya mengkompilasi pada satu mesin dan kemudian menjalankannya. Kemudian, dengan menggunakan executable terkompilasi yang sama saya menjalankannya di mesin kedua. Dari penjelasan Anda, tampaknya akan lebih baik untuk mengkompilasi ulang dari sumber di komputer kedua. Apakah itu masalahnya?
Osilasi Isopycnal
1
@IsopycnalOscillation Ketika mengkompilasi pada / untuk mesin tertentu, Anda dapat menggunakan opsi gcc / gfortran -march=native, atau opsi icc / ifort -xHOSTyang akan menerapkan optimasi khusus untuk arsitektur yang mendasarinya.
Pedro
1
Poin kunci di sini adalah bahwa kinerja komputer bukan kuantitas satu dimensi. Keseimbangan relatif dari semua faktor yang telah disebutkan oleh Godric di atas dapat sangat bervariasi, bahkan untuk komputer dengan chip prosesor dari produsen yang sama (misalnya Intel.) Sebagai akibatnya, tolok ukur yang berbeda dapat menunjukkan rasio kinerja yang sangat berbeda untuk dua prosesor. Sebagai masalah praktis, kebanyakan mesin modern benar-benar kekurangan bandwidth memori untuk mendukung beban kerja komputasi ilmiah dan ini sering menjadi hambatan.
Brian Borchers
2

x/yx-y

Kedua, pertanyaan Anda secara khusus mengecualikan perbedaan dalam perangkat lunak. Dalam pengalaman saya, penghargaan kinerja untuk penyetelan yang hati-hati bisa menjadi faktor besar, jadi saat Anda mempertimbangkan masalah perangkat keras, jangan lupa masalah perangkat lunak. Bagaimanapun, perangkat keras hanya dapat menjalankan instruksi yang Anda berikan, dan jika Anda memberikannya lebih sedikit, itu akan selesai lebih cepat.

Bukan untuk memperluas ini terlalu banyak, tetapi untuk setiap masalah yang ada ada tak terhitung program yang akan menyelesaikannya. Di antara ini, beberapa memakan waktu lebih sedikit daripada yang lain, dan itu adalah batas bawah. Jangan menganggap program apa pun berada pada atau bahkan di dekat batas bawah ini jika belum disetel dengan cermat.

Tautan ini menjelaskan secara rinci metode ortodoks yang saya gunakan.

Mike Dunlavey
sumber