در این مطلب، ویدئو محاسبات با عملکرد بالا با پایتون: Numba و GPU با زیرنویس فارسی را برای دانلود قرار داده ام. شما میتوانید با پرداخت 15 هزار تومان ، این ویدیو به علاوه تمامی فیلم های سایت را دانلود کنید.اکثر فیلم های سایت به زبان انگلیسی می باشند. این ویدئو دارای زیرنویس فارسی ترجمه شده توسط هوش مصنوعی می باشد که میتوانید نمونه ای از آن را در قسمت پایانی این مطلب مشاهده کنید.
مدت زمان فیلم: 00:25:28
تصاویر این ویدئو:
قسمتی از زیرنویس این فیلم:
00:00:03,590 –> 00:00:08,180
تا کنون ما فقط از گودال CPU
2
00:00:08,180 –> 00:00:10,400
3
00:00:10,400 –> 00:00:13,850
4
00:00:13,850 –> 00:00:19,880
5
00:00:19,880 –> 00:00:24,050
6
00:00:24,050 –> 00:00:29,749
7
00:00:29,749 –> 00:00:34,430
استفاده کردهایم. قبلاً ذکر شد،
8
00:00:34,430 –> 00:00:37,040
زمانی که ما بردار اعداد را انجام دادیم، میتوانیم
9
00:00:37,040 –> 00:00:43,840
از فانکهایی مانند زمان فرار خود استفاده کنیم و
10
00:00:43,960 –> 00:00:51,880
میتوانیم آن را برداریم و به آن هدف بدهیم،
11
00:00:51,880 –> 00:00:57,770
و اگر هدف را به
12
00:00:57,770 –> 00:01:00,830
موازات CUDA هدف جایگزین کنید، در واقع
13
00:01:00,830 –> 00:01:05,449
عملکرد را روی GPU
14
00:01:05,449 –> 00:01:07,579
انجام میدهد و مقداری را انجام میدهد. مقایسه سرعت در
15
00:01:07,579 –> 00:01:14,229
نوت بوک اما می توانید کارهای بیشتری انجام دهید
16
00:01:17,970 –> 00:01:20,820
Kirra برای پایتون یکی از
17
00:01:20,820 –> 00:01:24,530
لهجه های رسمی شناخته شده برای CUDA است
18
00:01:24,530 –> 00:01:30,590
درست مانند QR C++ یا CUDA Fortran
19
00:01:30,590 –> 00:01:32,580
Python زیبا به طور
20
00:01:32,580 –> 00:01:34,650
رسمی توسط انویدیا به عنوان یکی از
21
00:01:34,650 –> 00:01:40,460
لهجه های برنامه نویسی پردازنده های گرافیکی آنها شناخته شده است، اما
22
00:01:40,460 –> 00:01:46,860
قبل از اینکه به آن بپردازیم. نحوه استفاده از این، اجازه دهید
23
00:01:46,860 –> 00:01:49,350
کمی در مورد پردازندههای گرافیکی به شما بگویم و
24
00:01:49,350 –> 00:01:51,930
تفاوت آنها با چه کسی قبلاً از GPU استفاده کرده است،
25
00:01:51,930 –> 00:01:55,290
چه کسی قبل از آن برای یک GPU برنامهریزی کرده است،
26
00:01:55,290 –> 00:01:57,840
سپس برای بسیاری از شما. s
27
00:01:57,840 –> 00:02:02,870
فقط یک تکرار است اما فقط
28
00:02:03,530 –> 00:02:11,039
CPU در مقابل GPU ما را تحمل کنید خوب یک CPU به نوعی
29
00:02:11,039 –> 00:02:16,500
مانند یک موتور سیکلت است که می توانید کارها را
30
00:02:16,500 –> 00:02:21,900
سریع انجام دهید و تاخیر کمی برای رسیدن
31
00:02:21,900 –> 00:02:26,459
از A به B دارید اما این فقط در صورتی درست
32
00:02:26,459 –> 00:02:28,950
است که تعداد افراد کمی داشته باشید.
33
00:02:28,950 –> 00:02:33,150
34
00:02:33,150 –> 00:02:37,590
اگر می خواهید 50 نفر را
35
00:02:37,590 –> 00:02:41,580
از لوگانو به میلانو ببرید
36
00:02:41,580 –> 00:02:46,050
با موتور سیکلت مشکل
37
00:02:46,050 –> 00:02:49,850
38
00:02:49,850 –> 00:02:55,860
خواهید داشت. به آنجا برسید
39
00:02:55,860 –> 00:02:59,010
اما در نهایت اگر 60 نفر را در
40
00:02:59,010 –> 00:03:04,440
آن جا دهید، توان عملیاتی کلی شما
41
00:03:04,440 –> 00:03:09,989
با یک اتوبوس ممکن است بسیار بهتر باشد، CPUها
42
00:03:09,989 –> 00:03:14,570
در واقع برای تأخیر بهینه شده اند، بنابراین CPUها
43
00:03:14,570 –> 00:03:20,310
سعی می کنند دستوری را
44
00:03:20,310 –> 00:03:23,540
که شما به آن می دهید در سریع ترین
45
00:03:23,540 –> 00:03:26,930
زمان ممکن دریافت کنند یا اجرا کنند. بهینه سازی های زیادی را انجام دهید که
46
00:03:26,930 –> 00:03:29,010
کش ها در واقع بخشی از آن
47
00:03:29,010 –> 00:03:31,349
بهینه سازی هستند
48
00:03:31,349 –> 00:03:33,810
، از طرف دیگر gpus برای توان عملیاتی بهینه سازی شده است.
49
00:03:33,810 –> 00:03:37,439
GPU ها برای انجام کارهای گرافیکی ساخته شده اند،
50
00:03:37,439 –> 00:03:44,159
اگر من تصویری را برای یک
51
00:03:44,159 –> 00:03:49,139
GP برای یک بازی به عنوان مثال با سرعت 60 فریم
52
00:03:49,139 –> 00:03:52,469
در ثانیه ارائه می کنم، هیچ کس مراقبت h خیلی سریع
53
00:03:52,469 –> 00:03:56,129
میتوانم یک پیکسل را
54
00:03:56,129 –> 00:04:01,079
محاسبه کنم، میخواهم 2 یا 4 میلیون یا 8 میلیون
55
00:04:01,079 –> 00:04:05,099
پیکسل خود را اگر تک تک پیکسلها را بهروزرسانی کنم
56
00:04:05,099 –> 00:04:10,790
که معمولاً آشفتگی ایجاد میکنند، محاسبه میکنم، بنابراین پردازندههای گرافیکی
57
00:04:10,790 –> 00:04:15,000
برای حجم کاری طراحی شدهاند که
58
00:04:15,000 –> 00:04:18,660
همین کار را روی دادههای زیاد انجام میدهند. بنابراین در
59
00:04:18,660 –> 00:04:20,190
ابتدا آنها برای حجم کاری موازی داده طراحی شده بودند،
60
00:04:20,190 –> 00:04:28,380
این
61
00:04:28,380 –> 00:04:30,570
تصمیمات طراحی متفاوت، این اهداف متفاوت
62
00:04:30,570 –> 00:04:33,030
در واقع منجر به معماری
63
00:04:33,030 –> 00:04:38,130
های مختلف و استفاده متفاوت از قالب در CPU
64
00:04:38,130 –> 00:04:39,509
برای طولانی ترین مدتی شد که در واقع
65
00:04:39,509 –> 00:04:41,280
سعی داشتند مخفی کنند یا موازی هایی
66
00:04:41,280 –> 00:04:45,720
که روی CPU آنها وجود داشت می توانند انجام دهند. از دستور
67
00:04:45,720 –> 00:04:47,930
اجرای برای استفاده
68
00:04:47,930 –> 00:04:50,699
موثر از واحدهای مختلف حسابی و منطقی
69
00:04:50,699 –> 00:04:52,770
حتی اگر کد برنامه شما
70
00:04:52,770 –> 00:04:57,210
موازی سازی مورد نیاز را فراهم نکند، یک
71
00:04:57,210 –> 00:05:00,060
CPU یک دستور if یا بخشی از
72
00:05:00,060 –> 00:05:02,720
یک دستور if را اجرا می کند،
73
00:05:02,720 –> 00:05:05,250
حتی اگر حتی به آن قسمت هم نرسیده باشد.
74
00:05:05,250 –> 00:05:06,990
هنوز نمیداند که آیا شرط درست است یا
75
00:05:06,990 –> 00:05:11,400
نه و اگر شکست خورد، اگر
76
00:05:11,400 –> 00:05:13,680
آنچه را که فکر میکردید انجام ندادید – فقط
77
00:05:13,680 –> 00:05:17,520
باید آن را دوباره اجرا کند، اما قبلاً
78
00:05:17,520 –> 00:05:21,300
انجام شده است. کاری که میخواهید انجام دهید
79
00:05:21,300 –> 00:05:22,349
میتواند آن مرحله را رد کرده
80
00:05:22,349 –> 00:05:24,630
و ادامه دهید و اساساً از نظر
81
00:05:24,630 –> 00:05:28,310
داخلی موازیسازی بیشتری به شما میدهد که
82
00:05:28,310 –> 00:05:32,090
به کمی منطق کنترل
83
00:05:32,090 –> 00:05:35,130
نیاز دارد، حافظههای نهان با این سطوح
84
00:05:35,130 –> 00:05:37,680
مختلف حافظه پنهان تقریباً به
85
00:05:37,680 –> 00:05:40,199
سرعت پردازنده نیز میرسند.
86
00:05:40,199 –> 00:05:44,790
فضای کمی در پردازنده گرافیکی
87
00:05:44,790 –> 00:05:47,330
روی پردازنده گرافیکی روی پردازنده گرافیکی از طرف دیگر
88
00:05:47,330 –> 00:05:51,630
ما تعداد زیادی واحد حسابی و منطقی
89
00:05:51,630 –> 00:05:57,800
با کنترل و حافظه نهان
90
00:05:57,800 –> 00:06:02,220
بسیار کمی داریم که فضای کمی برای واحدهای کنترل وجود دارد
91
00:06:02,220 –> 00:06:04,950
که در واقع همه این واحدهای حسابی و
92
00:06:04,950 –> 00:06:08,610
منطقی دارند. برای انجام همان کار، به
93
00:06:08,610 –> 00:06:12,290
جای اینکه هر رشته یک کار را انجام دهد،
94
00:06:12,290 –> 00:06:16,620
کل مجموعه شما باید همان کار را انجام دهد،
95
00:06:16,620 –> 00:06:20,760
این همان چیزی است
96
00:06:20,760 –> 00:06:23,640
که اگر از دستورالعمل های نیمه بر روی یک CPU استفاده می کنیم،
97
00:06:23,640 –> 00:06:26,190
بنابراین این واحدهای برداری در CPU
98
00:06:26,190 –> 00:06:27,990
جایی که من گفت که آنها می توانند برای
99
00:06:27,990 –> 00:06:30,540
اعداد با دقت دوبرابر به طور همزمان انجام دهند،
100
00:06:30,540 –> 00:06:33,570
از بسیاری جهات، این واحدهای برداری هستند
101
00:06:33,570 –> 00:06:36,240
که می توانند 32 عدد دقت را در همان زمان دو برابر کنند،
102
00:06:36,240 –> 00:06:43,710
این رویکرد متفاوتی
103
00:06:43,710 –> 00:06:48,180
که من در CPU دارم، جایی که می خواهم قادر باشم.
104
00:06:48,180 –> 00:06:49,980
e برای اجرای یک آیه دستورالعمل واحد،
105
00:06:49,980 –> 00:06:52,860
بنابراین GPU است که من میخواهم در آن
106
00:06:52,860 –> 00:06:56,220
مقدار زیادی اجرا کنم و به توان عملیاتی برسم، همچنین
107
00:06:56,220 –> 00:07:00,770
منجر به انواع مختلفی از اجرای مدلهای
108
00:07:02,990 –> 00:07:05,940
gpus از رشتههای بسیار سبک وزن و
109
00:07:05,940 –> 00:07:14,160
بسیاری از آنها بر روی یک cpu
110
00:07:14,160 –> 00:07:17,729
شده است. هستههای 24 رشتههای سختافزاری
111
00:07:17,729 –> 00:07:22,470
و اگر هر یک از این 24 هسته
112
00:07:22,470 –> 00:07:26,610
24 رشته را شروع میکردند، در حال حاضر به هم
113
00:07:26,610 –> 00:07:31,380
ریخته میشود، زیرا CPU روی پردازنده گرافیکی
114
00:07:31,380 –> 00:07:33,660
اصلاً اذیت نمیشود، در واقع رشتههای بسیار کمی
115
00:07:33,660 –> 00:07:42,030
در یک GPU است، ما به
116
00:07:42,030 –> 00:07:46,160
جای اجتناب از آن، تأخیر زیادی داریم. به این معنی که
117
00:07:46,160 –> 00:07:52,139
وقتی چند کار دارم که به مقداری داده نیاز دارد،
118
00:07:52,139 –> 00:07:57,690
سپس در GPU درخواست داده را شروع میکنم،
119
00:07:57,690 –> 00:08:02,760
سپس این کار را کنار میگذارم و
120
00:08:02,760 –> 00:08:05,280
بعدی را اجرا میکنم، سپس کار بعدی
121
00:08:05,280 –> 00:08:08,070
حداقل در ابتدا درخواست داده خود را شروع میکند.
122
00:08:08,070 –> 00:08:11,070
123
00:08:11,070 –> 00:08:13,560
دادهها را ندارد، بنابراین ادامه میدهیم
124
00:08:13,560 –> 00:08:17,130
این اساساً درخواستهای بیشتر و بیشتری
125
00:08:17,130 –> 00:08:21,979
را به موتور انتقال حافظه ارسال میکند
126
00:08:21,979 –> 00:08:24,750
تا زمانی که موتور اول واقعاً دادههای خود را به دست آورد،
127
00:08:24,750 –> 00:08:28,950
اکنون میتواند روی دادهها کار کند تا
128
00:08:28,950 –> 00:08:30,000
زمانی که انجام شود
129
00:08:30,000 –> 00:08:33,779
، وظیفه دوم دادههای خود را دارد و میتواند د
130
00:08:33,779 –> 00:08:36,299
o کار می کند، بنابراین وقتی
131
00:08:36,299 –> 00:08:41,070
خط لوله را با دستورات بارگذاری داده پر کردیم،
132
00:08:41,070 –> 00:08:42,419
به نقطه ای می رسیم که می توانیم
133
00:08:42,419 –> 00:08:45,860
داده ها را یکی پس از دیگری اجرا
134
00:08:45,860 –> 00:08:48,720
کنیم، بنابراین سعی نمی کنیم از شر این تأخیر خلاص شویم،
135
00:08:48,720 –> 00:08:50,430
شما فقط سعی می کنید آن را پنهان کنید.
136
00:08:50,430 –> 00:08:53,100
قادر به نگه داشتن تعداد زیادی thread
137
00:08:53,100 –> 00:08:55,740
و پرواز هزاران نفر از آنها در حال
138
00:08:55,740 –> 00:08:58,230
پرواز در اینجا به این معنی است که تمام
139
00:08:58,230 –> 00:08:59,850
رجیسترها و تمام
140
00:08:59,850 –> 00:09:02,700
اطلاعات داخلی را در حافظه نگه می دارد و می تواند
141
00:09:02,700 –> 00:09:06,630
در یک چرخه یک تا دو چرخه به آن دسترسی داشته باشد، بنابراین
142
00:09:06,630 –> 00:09:09,029
روشن کردن رشته پردازشگر گرافیکی بسیار
143
00:09:09,029 –> 00:09:11,300
سریع است.
144
00:09:13,619 –> 00:09:18,809
به دلیل منشأ آن، پردازندههای گرافیکی به خوبی روی
145
00:09:18,809 –> 00:09:23,019
دادههای شبکه کار میکنند، بنابراین اگر بتوانید مشکل خود
146
00:09:23,019 –> 00:09:26,529
را در یک شبکه ترسیم کنید، معمولاً
147
00:09:26,529 –> 00:09:33,839
روی
148
00:09:33,839 –> 00:09:37,420
149
00:09:37,420 –> 00:09:39,339
150
00:09:39,339 –> 00:09:43,420
GPU نیز به خوبی کار میکند. اما قبلاً
151
00:09:43,420 –> 00:09:45,160
اینطور نبود، بنابراین در
152
00:09:45,160 –> 00:09:47,259
کارتهای پاسکال که در اینجا وجود دارند،
153
00:09:47,259 –> 00:09:48,970
روی کارتهای ولتایی که همیشه
154
00:09:48,970 –> 00:09:52,089
در سیستمهای اینجا نیز وجود دارند، به خوبی کار نمیکند،
155
00:09:52,089 –> 00:10:00,029
همچنین با دادههای نامنظم
156
00:10:00,029 –> 00:10:03,489
وقتی روی یک GPU کار میکنیم، خیلی خوب کار میکند. ما معمولاً در مورد کرنل ها صحبت می کنیم
157
00:10:03,489 –> 00:10:08,319
هسته ها روال های کوچکی
158
00:10:08,319 –> 00:10:12,040
هستند که توسط هر رشته انجام می شود، بنابراین درست مانند
159
00:10:12,040 –> 00:10:14,439
برنامه MPI ما که در واقع توسط
160
00:10:14,439 –> 00:10:16,509
هر کار MPI اجرا می شود و ما باید
161
00:10:16,509 –> 00:10:19,089
بسته به رتبه تصمیم بگیریم که
162
00:10:19,089 –> 00:10:21,160
همین امر برای رشته برای هسته ها نیز صادق است.
163
00:10:21,160 –> 00:10:28,689
بیایید ببینیم هسته ممکن است چیست، بنابراین
164
00:10:28,689 –> 00:10:30,459
در اینجا ما Mandelbrot خود را دوباره تنظیم می
165
00:10:30,459 –> 00:10:38,069
کنیم و به این دو حلقه در اینجا نگاه می کنیم.
166
00:10:38,069 –> 00:10:43,869
167
00:10:43,869 –> 00:10:47,519
168
00:10:47,519 –> 00:10:53,399
169
00:10:53,399 –> 00:10:56,079
زمان و آن را
170
00:10:56,079 –> 00:11:01,860
به m IJ اختصاص دهید اکنون
171
00:11:03,499 –> 00:11:07,230
این دو مرحله برای هر یک
172
00:11:07,230 –> 00:11:12,600
از تکرارها مستقل هستند، بنابراین من می توانم فقط
173
00:11:12,600 –> 00:11:16,079
این دو را در یک تابع قرار
174
00:11:16,079 –> 00:11:19,230
دهم و آن تابع را فراخوانی کنم و
175
00:11:19,230 –> 00:11:27,179
سپس این هسته ای خواهد بود که من برای
176
00:11:27,179 –> 00:11:29,970
سازماندهی این تهدیدات فراخوانی می کنم. گفت من می توانم
177
00:11:29,970 –> 00:11:33,329
هزاران نفر از میلیون ها آنها را داشته باشم. cuda
178
00:11:33,329 –> 00:11:38,790
از برخی طرح های سازمانی مبتنی بر
179
00:11:38,790 –> 00:11:46,379
بلوک ها و شبکه های رشته ها استفاده می کند. ما با یک رشته شروع می کنیم.
180
00:11:46,379 –> 00:11:51,230
181
00:11:51,230 –> 00:11:56,100
182
00:11:56,100 –> 00:12:01,170
شناسه اولین گروه بندی یک
183
00:12:01,170 –> 00:12:05,040
بلوک رشته است و از بسیاری جهات این
184
00:12:05,040 –> 00:12:08,790
گروه مربوطه است، یک بلوک رشته همیشه
185
00:12:08,790 –> 00:12:10,679
روی همان چند پردازنده جریانی اجرا می شود
186
00:12:10,679 –> 00:12:13,529
که البته در داخل
187
00:12:13,529 –> 00:12:17,189
یک GPU است، نباید اشتباه گرفته شود که Nvidia
188
00:12:17,189 –> 00:12:20,459
آن را CUDA core می نامد که در واقع یکی
189
00:12:20,459 –> 00:12:25,519
از این خطوط است. از میان این خطوط برداری
190
00:12:25,819 –> 00:12:28,769
، فرآیندهای چندگانه استریم
191
00:12:28,769 –> 00:12:33,709
تقریباً با هسته CPU قابل مقایسه هستند. یک
192
00:12:35,179 –> 00:12:38,970
بلوک نخ روی
193
00:12:38,970 –> 00:12:41,579
یکی از این چند پردازندهها برنامهریزی میشود و
194
00:12:41,579 –> 00:12:45,329
در آنجا باقی میماند تا به یکی از چند پردازندههای جریانی پین شود، به
195
00:12:45,329 –> 00:12:47,790
این
196
00:12:47,790 –> 00:12:50,009
معنی که تمام رشته هایی که
197
00:12:50,009 –> 00:12:53,329
در این قفل رشته زندگی می کنند در واقع می
198
00:12:53,329 –> 00:12:57,299
توانند حافظه مشترکی را به اشتراک بگذارند که یک حافظه سریع محلی
199
00:12:57,299 –> 00:13:00,749
به نام حافظه اشتراکی نامیده می شود.
200
00:13:00,749 –> 00:13:03,449
201
00:13:03,449 –> 00:13:05,549
202
00:13:05,549 –> 00:13:08,910
203
00:13:08,910 –> 00:13:11,790
204
00:13:11,790 –> 00:13:13,679
گروهی که میخواهید
205
00:13:13,679 –