Membagi pekerjaan antar thread

Saya tahu ada pertanyaan serupa, tetapi tidak ada satupun yang menjawab pertanyaan saya.

Saya mencoba membagi loop besar (2^60) menjadi beberapa loop kecil yang didistribusikan di antara utas. Kisaran loop dapat bervariasi dari (2^4) hingga (2^60). Pertanyaan saya adalah bagaimana cara menentukan jumlah utas yang optimal (maks=8, min=1) dan bagaimana membagi pekerjaan di antara mereka. Jika seseorang dapat menunjukkan dengan sebuah contoh, itu akan sangat bagus.

Misalnya.. Saya mencoba membagi 2^32 di antara 8 utas. Jadi setiap thread akan melakukan 2^29 pekerjaan, bukan? tapi bagaimana cara membagi rentangnya? (0... 2^29),(2^29....2^30)... ? Maaf jika itu matematika yang buruk tetapi pikiran saya tidak berfungsi dengan baik lagi.


person questions    schedule 14.03.2012    source sumber


Jawaban (3)


Hal yang mudah dilakukan hanyalah membagi nomor dengan jumlah utas dan menggunakannya. Misalkan m=lantai(n/k). 0..(m-1), m..(2m-1).... adalah awal dan akhir loop.

Tidak yakin mengapa Anda terobsesi 2^as. Apakah ada alasan khusus? Jika tidak, lakukan seperti yang Anda lakukan untuk rentang lainnya. Bagilah secara merata.

person ElKamina    schedule 14.03.2012
comment
@Elkamina- Pertanyaannya adalah bagaimana menentukan jumlah utas, berdasarkan rentang, yang tidak terlalu tinggi atau terlalu rendah. - person questions; 16.03.2012
comment
@questions Itu tergantung pada banyak hal lainnya! Berapa banyak inti yang Anda miliki, berapa lama Anda mampu menunggu, berapa banyak memori yang Anda miliki, berapa banyak memori yang digunakan setiap thread, berapa waktu IO untuk setiap thread... Dalam skenario komputasi intensif sederhana yang tidak memerlukan banyak RAM Menurut saya, jalankan thread sebanyak jumlah core di komputer Anda. - person ElKamina; 16.03.2012

Interval 2E29 berjalan seperti ini:

0 * 2E29 ~ 1 * 2E29    =     0           ~ 2E29
1 * 2E29 ~ 2 * 2E29    =     2E29        ~ 2E30
2 * 2E29 ~ 3 * 2E29    =     2E30        ~ 2E30 + 2E29
3 * 2E29 ~ 4 * 2E29    =     2E30 + 2E29 ~ 2E31
person Community    schedule 14.03.2012

Berikut adalah interval yang saya dapatkan

(0, 2^29 - 1)

(2^29, 2^30 - 1)

(2^30, 2^30 + 2^29 -1)

(2^30 + 2^29, 2^31 - 1)

(2^31, 2^31 + 2^29 - 1)

(2^31 + 2^29, 2^31 + 2^30 - 1)

(2^31 + 2^30, 2^31 + 2^30 + 2^29 - 1)

(2^31 + 2^30 + 2^29, 2^32 - 1)

Anda mungkin bingung karena 2^29 + 2^29 = 2^30 (monomial). Namun 2^30 + 2^29 tidak dapat ditambahkan ke monomial

person Wilmer E. Henao    schedule 14.03.2012