You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: lectures/numba.md
+37-11Lines changed: 37 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -660,15 +660,15 @@ with qe.Timer():
660
660
661
661
اکنون سعی کنید موازیسازی را اضافه کنید و ببینید آیا افزایش سرعت بیشتری به دست میآورید.
662
662
663
-
نباید انتظار افزایش بزرگی در اینجا داشته باشید زیرا، در حالی که وظایف مستقل زیادی وجود دارد (کشیدن نقطه و آزمایش اگر در دایره است)، هر کدام زمان اجرای کمی دارد.
663
+
در اینجا وظایف مستقل زیادی وجود دارد (کشیدن یک نقطه و آزمایش اینکه آیا در دایره قرار میگیرد)، اما هر کدام زمان اجرای بسیار کمی دارد.
664
664
665
-
به طور کلی، موازیسازی زمانی کمتر موثر است که وظایف فردی که باید موازی شوند نسبت به کل زمان اجرا بسیار کوچک باشند.
665
+
به طور کلی، موازیسازی زمانی کمتر موثر است که وظایف فردی نسبت به سربارهای توزیع آنها در چندین CPU بسیار کوچک باشند.
666
666
667
-
این به دلیل سربارهای مرتبط با توزیع همه این وظایف کوچک در چندین CPU است.
667
+
راهحل این مشکل این است که به هر نخ کار کافی بدهیم تا آن سربارها ارزش پرداخت داشته باشند.
668
668
669
-
با این وجود، با سختافزار مناسب، امکان به دست آوردن افزایش سرعت غیر بدیهی در این تمرین وجود دارد.
669
+
پس، برای اندازه شبیهسازی Monte Carlo، از چیزی قابل توجه استفاده کنید، مانند `n = 100_000_000`.
670
670
671
-
برای اندازه شبیهسازی Monte Carlo، از چیزی قابل توجه استفاده کنید، مانند `n = 100_000_000`.
671
+
در این مقیاس، و با سختافزار مناسب، باید افزایش قابل توجهی نسبت به نسخه سریال ببینید.
موازیسازی زمانی سودمند است که هر نخ کار کافی برای غلبه بر هزینههای سربار داشته باشد، در حالی که مسئله را به بخشهایی تقسیم میکند تا کار به طور همزمان اتفاق بیفتد.
696
+
697
+
بیایید مجموعه جدید و بسیار بزرگتری از نقاط را بکشیم به جای استفاده مجدد از آرایههای بالا.
698
+
699
+
```{note}
700
+
دو آرایه زیر حدود 1.6 گیگابایت حافظه اشغال میکنند — اگر دستگاه شما حافظه رم کافی ندارد، `n` را کاهش دهید.
701
+
```
702
+
703
+
```{code-cell} ipython3
704
+
n = 100_000_000
705
+
rng = np.random.default_rng()
706
+
u_big = rng.uniform(size=n)
707
+
v_big = rng.uniform(size=n)
708
+
```
709
+
710
+
حالا بیایید ببینیم چقدر سریع اجرا میشود (فراخوانی دوم زمان اجرا را بدون زمان کامپایل اندازهگیری میکند):
696
711
697
712
```{code-cell} ipython3
698
713
with qe.Timer():
699
-
calculate_pi_parallel(u_draws, v_draws)
714
+
calculate_pi_parallel(u_big, v_big)
700
715
```
701
716
702
717
```{code-cell} ipython3
703
718
with qe.Timer():
704
-
calculate_pi_parallel(u_draws, v_draws)
719
+
calculate_pi_parallel(u_big, v_big)
720
+
```
721
+
722
+
برای مقایسه، در اینجا نسخه سریال jit شده از {ref}`speed_ex1` روی همان نقاط است:
723
+
724
+
```{code-cell} ipython3
725
+
with qe.Timer():
726
+
calculate_pi(u_big, v_big)
705
727
```
706
728
707
-
با روشن و خاموش کردن موازیسازی (انتخاب `True` یا `False` در annotation `@jit`)، میتوانیم افزایش سرعتی که چندنخی علاوه بر کامپایل JIT فراهم میکند را آزمایش کنیم.
729
+
با مقایسه دو زمانبندی آخر، چندنخی افزایش سرعت قابل توجهی علاوه بر کامپایل JIT فراهم میکند.
730
+
731
+
(اگر به صورت محلی اجرا میکنید، نتایج متفاوتی خواهید گرفت که عمدتاً به تعداد CPUها در دستگاه شما بستگی دارد — و در اندازههای نمونه کوچک، نسخه موازی میتواند حتی کندتر باشد، زیرا سودها نمیتوانند هزینه توزیع کار میان نخها را پوشش دهند.)
708
732
709
-
در ایستگاه کاری ما، میبینیم که موازیسازی در اینجا افزایش سرعت متوسط اما ارزشمندی فراهم میکند.
733
+
این دو آرایه بزرگ هستند و کار ما با آنها تمام شده است، پس حافظه را قبل از ادامه دادن آزاد میکنیم.
710
734
711
-
(اگر به صورت محلی اجرا میکنید، نتایج متفاوتی خواهید گرفت که عمدتاً به تعداد CPUها در دستگاه شما بستگی دارد.)
735
+
```{code-cell} ipython3
736
+
del u_big, v_big
737
+
```
712
738
713
739
توجه کنید که ما همه نقاط تصادفی را *قبل از* حلقه کشیدیم و آنها را به صورت آرایه عبور دادیم، بنابراین حلقه موازی فقط از حافظه *میخواند*.
0 commit comments