程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python CUDA 編程 - 4 - 網格跨步

編輯:Python

當核心數量不夠或想限制當前任務使用的GPU核心數時可以使用網格跨步的思路編寫CUDA程序。

背景

CUDA的執行配置:[gridDim, blockDim]中的blockDim最大只能是1024,但是並沒提到gridDim的最大限制。英偉達給出的官方回復是gridDim最大為一個32位整數的最大值,也就是2,147,483,648,大約二十億。這個數字已經非常大了,足以應付絕大多數的計算,但是如果對並行計算的維度有更高需求呢?答案是網格跨步,它能提供更優的並行計算效率。

網格跨步

  • 這裡仍然以[2, 4]的執行配置為例,該執行配置中整個grid只能並行啟動8個線程,假如我們要並行計算的數據是32,會發現後面8號至31號數據共計24個數據無法被計算。
  • 我們可以在0號線程中,處理第0、8、16、24號數據,這樣就能解決數據遠大於執行配置中的線程總數的問題,用程序表示,就是在核函數裡再寫個for循環。

優勢

  1. 擴展性:可以解決數據量比線程數大的問題
  2. 線程復用:CUDA線程啟動和銷毀都有開銷,主要是線程內存空間初始化的開銷;不使用網格跨步,CUDA需要啟動大於計算數的線程,每個線程內只做一件事情,做完就要被銷毀;使用網格跨步,線程內有for循環,每個線程可以干更多事情,所有線程的啟動銷毀開銷更少。
  3. 方便調試:我們可以把核函數的執行配置寫為[1, 1],如下所示,那麼核函數的跨步大小就成為了1,核函數裡的for循環與CPU函數中順序執行的for循環的邏輯一樣,非常方便驗證CUDA並行計算與原來的CPU函數計算邏輯是否一致。

參考資料

  • https://lulaoshi.info/gpu/python-cuda/stride.html

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved