]]>3040GPU 專業提示:CUDA 7 流簡化了并發性
http://www.open-lab.net/zh-cn/blog/gpu-pro-tip-cuda-7-streams-simplify-concurrency/
Tue, 01 Dec 2020 08:32:28 +0000http://www.open-lab.net/zh-cn/blog/?p=398Continued]]>異構計算是指高效地使用系統中的所有處理器,包括 CPU 和 GPU 。為此,應用程序必須在多個處理器上并發執行函數。 CUDA 應用程序通過在 streams 中執行異步命令來管理并發性,這些命令是按順序執行的。不同的流可以并發地執行它們的命令,也可以彼此無序地執行它們的命令。[見帖子[See the post 如何在 CUDA C / C ++中實現數據傳輸的重疊 ] 在不指定流的情況下執行異步 CUDA 命令時,運行時使用默認流。在 CUDA 7 之前,默認流是一個特殊流,它隱式地與設備上的所有其他流同步。 CUDA 7 引入了大量強大的新功能 ,包括一個新的選項,可以為每個主機線程使用獨立的默認流,這避免了傳統默認流的序列化。在這篇文章中,我將向您展示如何在 CUDA 程序中簡化實現內核和數據副本之間的并發。 如 CUDA C 編程指南所述,
]]>179CUDA Pro 技巧:使用 CUDA_VISIBLE_DEVICES 控制 GPU 的可見性
http://www.open-lab.net/zh-cn/blog/cuda-pro-tip-control-gpu-visibility-cuda_visible_devices/
Mon, 27 Jan 2014 07:30:28 +0000http://www.open-lab.net/zh-cn/blog/?p=300Continued]]>作為 CUDA 開發人員,您通常需要控制應用程序使用的設備。克里斯·梅森在 Accelerware 博客上發表了一篇簡短但很貼心的帖子,他寫道: 正如 Chris 指出的,健壯的應用程序應該使用 CUDA API 在運行時枚舉和選擇具有適當功能的設備。要了解如何操作,請閱讀 CUDA 編程指南中的 設備標識 部分。但是 環境變量可以方便地將執行限制到特定設備或設備集,以便進行調試和測試。您還可以使用它來控制沒有源代碼的應用程序的執行,或者在一臺機器上啟動一個程序的多個實例,每個實例都有自己的環境和一組可見的設備。 要使用它,請將 設置為逗號分隔的設備 ID 列表,以使應用程序只看到這些設備。請注意,您可以使用此技術來屏蔽設備或更改設備的可見性順序,以便 CUDA 運行時按特定順序枚舉它們。 在我們即將發布的帶有統一內存的 CUDA 6 版本中,
]]>425Numba:具有 CUDA 加速功能的高性能 Python
http://www.open-lab.net/zh-cn/blog/numba-python-cuda-acceleration/
Fri, 27 Sep 2013 07:05:46 +0000http://www.open-lab.net/zh-cn/blog/?p=214Continued]]>想要更多嗎?查看 DLI 實踐培訓課程: CUDA Python 加速計算基礎 [Note, this post was originally published September 19, 2013. It was updated on September 19, 2017.] Python 是一種高效的動態編程語言,廣泛應用于科學、工程和數據分析應用程序中。影響 python 流行的因素有很多,包括它簡潔而富有表現力的語法和標準的數據結構、全面的“包含電池”的標準庫、優秀的文檔、廣泛的庫和工具生態系統、專業支持的可用性以及大而開放的社區。不過,最重要的也許是 Python 這樣的動態類型化、解釋性語言所能實現的高生產率。 Python 既靈活又靈活,這使它成為快速原型設計和構建完整系統的優秀語言。 但是 Python 最大的優點也可能是它最大的弱點:
]]>214在 CUDA C / C ++ 中使用共享內存
http://www.open-lab.net/zh-cn/blog/using-shared-memory-cuda-cc/
Mon, 28 Jan 2013 07:23:00 +0000http://www.open-lab.net/zh-cn/blog/?p=218Continued]]>在 上一篇文章 中,我研究了如何將一組線程訪問的全局內存合并到一個事務中,以及對齊和跨步如何影響 CUDA 各代硬件的合并。對于最新版本的 CUDA 硬件,未對齊的數據訪問不是一個大問題。然而,不管 CUDA 硬件是如何產生的,在全局內存中大步前進都是有問題的,而且在許多情況下似乎是不可避免的,例如在訪問多維數組中沿第二個和更高維的元素時。但是,在這種情況下,如果我們使用共享內存,就可以合并內存訪問。在我在下一篇文章中向您展示如何避免跨越全局內存之前,首先我需要詳細描述一下共享內存。 因為它是片上的,共享內存比本地和全局內存快得多。實際上,共享內存延遲大約比未緩存的全局內存延遲低 100 倍(前提是線程之間沒有內存沖突,我們將在本文后面討論這個問題)。共享內存是按線程塊分配的,因此塊中的所有線程都可以訪問同一共享內存。
]]>218如何在 CUDA C/C++ 內核中高效訪問全局內存
http://www.open-lab.net/zh-cn/blog/how-access-global-memory-efficiently-cuda-c-kernels/
Sun, 13 Jan 2013 06:47:00 +0000http://www.open-lab.net/zh-cn/blog/?p=429Continued]]>在前面的 兩 文章 中,我們研究了如何在主機和設備之間高效地移動數據。在我們的 CUDA C / C ++系列的第六篇文章中,我們將討論如何有效地從內核中訪問設備存儲器,特別是 全局內存 。 在 CUDA 設備上有幾種內存,每種內存的作用域、生存期和緩存行為都不同。到目前為止,在本系列中,我們已經使用了駐留在設備 DRAM 中的 全局內存 ,用于主機和設備之間的傳輸,以及內核的數據輸入和輸出。這里的名稱 global 是指作用域,因為它可以從主機和設備訪問和修改。全局內存可以像下面代碼片段的第一行那樣使用 de Clara 說明符在全局(變量)范圍內聲明,或者使用 動態分配并分配給一個常規的 C 指針變量,如第 7 行所示。全局內存分配可以在應用程序的生命周期內保持。根據設備的 計算能力 ,全局內存可能被緩存在芯片上,也可能不在芯片上緩存。
]]>429如何在 CUDA C/C++ 中實現數據傳輸的重疊
http://www.open-lab.net/zh-cn/blog/how-overlap-data-transfers-cuda-cc/
Thu, 13 Dec 2012 06:54:53 +0000http://www.open-lab.net/zh-cn/blog/?p=432Continued]]>在上一期的 C / C ++ 文章 中,我們討論了如何在主機和設備之間高效地傳輸數據。在這篇文章中,我們討論了如何將數據傳輸與主機上的計算、設備上的計算相重疊,在某些情況下,主機和設備之間的其他數據傳輸。實現數據傳輸和其他操作之間的重疊需要使用 CUDA 流,所以首先讓我們了解一下流。 CUDA 中的 stream 是按照主機代碼發出的順序在設備上執行的操作序列。雖然流中的操作被保證按規定的順序執行,但是不同流中的操作可以被交錯,并且在可能的情況下,它們甚至可以并發運行。 CUDA 中的所有設備操作(內核和數據傳輸)都在一個流中運行。如果沒有指定流,則使用默認流(也稱為“空流”)。默認流與其他流不同,因為它是關于設備上操作的同步流:在所有先前發出的操作 在設備上的任何流中 完成之前,默認流中的任何操作都不會開始,
]]>432如何在 CUDA C / C ++ 中優化數據傳輸
http://www.open-lab.net/zh-cn/blog/how-optimize-data-transfers-cuda-cc/
Tue, 04 Dec 2012 07:58:00 +0000http://www.open-lab.net/zh-cn/blog/?p=230Continued]]>在 C + C ++系列 之前的 帖子 中,我們為該系列的主要推力奠定了基礎:如何優化 CUDA C / C ++代碼。本文就如何在主機和主機之間高效地傳輸數據展開討論。設備內存和 GPU 之間的峰值帶寬遠高于主機內存和設備內存之間的峰值帶寬(例如,在 GPU NVIDIA C2050 上為 144 GB / s ),而在 PCIe x16 Gen2 上為 8 GB / s 。這種差異意味著主機和 GPU 設備之間的數據傳輸的實現可能會影響或破壞應用程序的整體性能。讓我們從主機數據傳輸的一般原則開始。 在這篇文章中,我們將研究上面的前三條準則,并在下一篇文章中專門討論重疊數據傳輸。首先,我想談談如何在不修改源代碼的情況下測量數據傳輸所花費的時間。 為了測量每次數據傳輸所花費的時間,我們可以在每次傳輸前后記錄一個 CUDA 事件,并使用 ,
]]>230如何在 CUDA C/C++ 中實現性能度量
http://www.open-lab.net/zh-cn/blog/how-implement-performance-metrics-cuda-cc/
Thu, 01 Nov 2012 07:32:32 +0000http://www.open-lab.net/zh-cn/blog/?p=396Continued]]>在 本系列文章的第一篇 中,我們通過檢查 CUDA C/C++ SAXPY 來研究 CUDA C / C ++的基本元素。在第二篇文章中,我們將討論如何分析這個和其他 CUDA C / C ++代碼的性能。我們將依賴于這些性能測量技術在未來的職位,性能優化將變得越來越重要。 CUDA 性能度量通常是從主機代碼中完成的,可以使用 CPU 計時器或 CUDA 特定計時器來實現。在討論這些性能度量技術之前,我們需要討論如何在主機和設備之間同步執行。 讓我們看看數據傳輸和來自 上一篇文章 的 SAXPY 主機代碼的內核啟動: 使用 在主機和設備之間的數據傳輸是 synchronous (或 blocking )傳輸。同步數據傳輸在之前發出的所有 CUDA 調用完成之前不會開始,后續的 CUDA 調用在同步傳輸完成之前無法開始。因此,
]]>396CUDA C 和 C++ 的簡單介紹
http://www.open-lab.net/zh-cn/blog/easy-introduction-cuda-c-and-c/
Sun, 21 Oct 2012 07:54:00 +0000http://www.open-lab.net/zh-cn/blog/?p=444Continued]]>本文是 CUDA C 和 C ++的一個系列,它是 CUDA 并行計算平臺的 C / C ++接口。本系列文章假定您熟悉 C 語言編程。我們將針對 Fortran 程序員運行一系列關于 CUDA Fortran 的文章。這兩個系列將介紹 CUDA 平臺上并行計算的基本概念。從這里起,除非我另有說明,我將用“ CUDA C ”作為“ CUDA C 和 C ++”的速記。 CUDA C 本質上是 C / C ++,具有幾個擴展,允許使用并行的多個線程在 GPU 上執行函數。 在我們跳轉到 CUDA C 代碼之前, CUDA 新手將從 CUDA 編程模型的基本描述和使用的一些術語中受益。 CUDA 編程模型是一個異構模型,其中使用了 CPU 和 GPU 。在 CUDA 中, host 指的是 CPU 及其存儲器, device 是指 GPU 及其存儲器。