[英]Threading paradigm?
是否有任何范例給您不同的心態或對編寫多線程應用程序有不同的看法? 也許感覺上有很大的不同,例如從過程編程到函數編程。
我不太了解這個問題,但是如果您開始使用CUDA進行一些編碼,則會為您提供有關多線程應用程序的不同思考方式。
它與一般的多線程技術(例如信號量,監視器等)不同,因為您同時具有數千個線程。 因此,CUDA中的並行性問題更多地在於對數據進行分區和稍后混合數據塊。
完全重新思考一個常見串行問題的一個小例子就是SCAN算法。 它很簡單:
我需要以下設置:
{a,a + b,a + b + c,a + b + c + d,a + b + c + d + e}
在這種情況下,符號“ +”是任何交換運算符(不僅是加號,還可以進行乘法運算)。
如何並行執行此操作? 本文對此進行了全面的重新思考。
可以在NVIDIA 網站上找到CUDA中不同算法的更多實現。
好吧,一個非常保守的范式轉換是從以線程為中心的並發(共享所有內容)到以進程為中心的並發(地址空間分離)。 這樣一來,可以避免意外的數據共享,並且可以更輕松地在不同子系統之間實施通信策略。
這個想法是古老的,並由Micro-Kernel OS社區傳播(其中包括)以構建更可靠的操作系統。 有趣的是,Microsoft Research的Singularity OS原型表明,使用此模型時,甚至不需要傳統的地址空間。
我最喜歡的一個相對較新的想法是事務性存儲 :通過確保更新始終是原子性來避免並發問題。
看看OpenMP的有趣變化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.