Mark Harris – NVIDIA 技術博客 http://www.open-lab.net/zh-cn/blog 閱讀開發者創建的最新技術信息、頭條新聞 和內容。 Thu, 21 Apr 2022 03:03:14 +0000 zh-CN hourly 1 196178272 用 CUDA int128 實現高精度十進制算法 http://www.open-lab.net/zh-cn/blog/implementing-high-precision-decimal-arithmetic-with-cuda-int128/ Thu, 10 Feb 2022 02:37:00 +0000 http://www.open-lab.net/zh-cn/blog/?p=3040 Continued]]> “事實太復雜了,除了近似,什么都不允許。 ” — 約翰·馮·諾依曼 計算的歷史已經證明,用計算機硬件實現的相對簡單的算法所能實現的是無限的。但計算機用有限大小的數字表示的“真相”基本上是近似的。正如大衛·戈德伯格所寫,“ 將無限多個實數壓縮成有限位數需要一個近似表示 。”浮點是實數最廣泛使用的表示形式,在許多處理器中都有實現,包括 GPU 。它之所以受歡迎,是因為它能夠代表一個大的動態范圍的價值觀,并權衡范圍和精度。 不幸的是,浮點的靈活性和范圍可能會在某些應用程序中造成麻煩,因為在固定范圍內的精度更為重要:想想美元和美分。二進制浮點數不能準確地代表每一個十進制值,它們的近似值和舍入可能會導致累積錯誤,例如,在會計計算中可能是不可接受的。此外,添加非常大和非常小的浮點數可能會導致截斷錯誤。由于這些原因,許多貨幣和會計計算都是使用定點十進制算法實現的,該算法存儲固定數量的小數位數。

Source

]]>
3040
GPU 專業提示: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 +0000 http://www.open-lab.net/zh-cn/blog/?p=398 Continued]]> 異構計算是指高效地使用系統中的所有處理器,包括 CPU 和 GPU 。為此,應用程序必須在多個處理器上并發執行函數。 CUDA 應用程序通過在 streams 中執行異步命令來管理并發性,這些命令是按順序執行的。不同的流可以并發地執行它們的命令,也可以彼此無序地執行它們的命令。[見帖子[See the post 如何在 CUDA C / C ++中實現數據傳輸的重疊 ] 在不指定流的情況下執行異步 CUDA 命令時,運行時使用默認流。在 CUDA 7 之前,默認流是一個特殊流,它隱式地與設備上的所有其他流同步。 CUDA 7 引入了大量強大的新功能 ,包括一個新的選項,可以為每個主機線程使用獨立的默認流,這避免了傳統默認流的序列化。在這篇文章中,我將向您展示如何在 CUDA 程序中簡化實現內核和數據副本之間的并發。 如 CUDA C 編程指南所述,

Source

]]>
398
CUDA 初學者統一內存 http://www.open-lab.net/zh-cn/blog/unified-memory-cuda-beginners/ Sun, 19 Nov 2017 06:26:00 +0000 http://www.open-lab.net/zh-cn/blog/?p=267 Continued]]> 我之前的介紹文章,“ 更容易介紹 CUDA C ++ ”介紹了 CUDA 編程的基本知識,它演示了如何編寫一個簡單的程序,在內存中分配兩個可供 GPU 訪問的數字數組,然后將它們加在 GPU 上。為此,我向您介紹了統一內存,這使得分配和訪問系統中任何處理器上運行的代碼都可以使用的數據變得非常容易, CPU 或 GPU 。 為此,我向您介紹了統一內存,它可以非常輕松地分配和訪問可由系統中任何處理器、CPU 或 GPU 上運行的代碼使用的數據。 首先,因為 NVIDIA Titan X 和 NVIDIA Tesla P100 等 Pascal GPU 是第一批包含頁面遷移引擎的 GPU,該引擎是統一內存頁面錯誤和頁面遷移的硬件支持。 第二個原因是它提供了一個很好的機會來了解更多關于統一內存的信息。 對! 但是讓我們看看。 首先,

Source

]]>
267
CUDA 的更簡單介紹 http://www.open-lab.net/zh-cn/blog/even-easier-introduction-cuda/ Wed, 25 Jan 2017 02:56:06 +0000 http://www.open-lab.net/zh-cn/blog/?p=179 Continued]]> 請于 10 月 5 日至 9 日在線參加 GPU 技術會議( GTC ) ,包括現場和點播課程、折扣 NVIDIA 深度學習培訓中心培訓,以及與行業專家聯系的機會。今年的產品包括: 這篇文章是對 CUDA 的一個超級簡單的介紹,這是一個流行的并行計算平臺和 NVIDIA 的編程模型。我在 2013 年給 CUDA 寫了一篇前一篇 “簡單介紹” ,這幾年來非常流行。但是 CUDA 編程變得越來越簡單, GPUs 也變得更快了,所以是時候更新(甚至更容易)介紹了。 CUDA C ++只是使用 CUDA 創建大規模并行應用程序的一種方式。它讓您使用強大的 C ++編程語言來開發由數千個并行線程加速的高性能算法 GPUs 。許多開發人員已經用這種方式加速了他們對計算和帶寬需求巨大的應用程序,包括支持人工智能正在進行的革命的庫和框架 深度學習 。

Source

]]>
179
CUDA 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 +0000 http://www.open-lab.net/zh-cn/blog/?p=300 Continued]]> 作為 CUDA 開發人員,您通常需要控制應用程序使用的設備。克里斯·梅森在 Accelerware 博客上發表了一篇簡短但很貼心的帖子,他寫道: 正如 Chris 指出的,健壯的應用程序應該使用 CUDA API 在運行時枚舉和選擇具有適當功能的設備。要了解如何操作,請閱讀 CUDA 編程指南中的 設備標識 部分。但是 環境變量可以方便地將執行限制到特定設備或設備集,以便進行調試和測試。您還可以使用它來控制沒有源代碼的應用程序的執行,或者在一臺機器上啟動一個程序的多個實例,每個實例都有自己的環境和一組可見的設備。 要使用它,請將 設置為逗號分隔的設備 ID 列表,以使應用程序只看到這些設備。請注意,您可以使用此技術來屏蔽設備或更改設備的可見性順序,以便 CUDA 運行時按特定順序枚舉它們。 在我們即將發布的帶有統一內存的 CUDA 6 版本中,

Source

]]>
300
CUDA 專業提示:nvprof 是你便捷的通用 GPU 剖析器 http://www.open-lab.net/zh-cn/blog/cuda-%e4%b8%93%e4%b8%9a%e6%8f%90%e7%a4%ba%ef%bc%9anvprof-%e6%98%af%e4%bd%a0%e4%be%bf%e6%8d%b7%e7%9a%84%e9%80%9a%e7%94%a8-gpu-%e5%89%96%e6%9e%90%e5%99%a8/ Wed, 02 Oct 2013 06:12:19 +0000 http://www.open-lab.net/zh-cn/blog/?p=425 Continued]]> CUDA 5 為 CUDA 工具箱添加了一個強大的新工具: 。 是一個可用于 Linux 、 Windows 和 OS X 的命令行探查器。乍一看, 似乎只是 NVIDIA Visual Profiler 和 NSight 日蝕版 中圖形分析功能的無 GUI 版本。但是 遠不止這些;對我來說, 是一個輕量級的分析器,它達到了其他工具所不能達到的水平。 我經常想知道我的 CUDA 應用程序是否按預期運行。有時這只是一個正常的檢查:應用程序是否在 GPU 上運行內核?它是否執行過多的內存復制?通過使用 運行我的應用程序,我可以快速看到它所使用的所有內核和內存副本的摘要,如下面的示例輸出所示。 在默認的 摘要模式 中, nvprof 提供了應用程序中 GPU 內核和內存副本的概述。摘要將對同一內核的所有調用組合在一起,

Source

]]>
425
Numba:具有 CUDA 加速功能的高性能 Python http://www.open-lab.net/zh-cn/blog/numba-python-cuda-acceleration/ Fri, 27 Sep 2013 07:05:46 +0000 http://www.open-lab.net/zh-cn/blog/?p=214 Continued]]> 想要更多嗎?查看 DLI 實踐培訓課程: CUDA Python 加速計算基礎 [Note, this post was originally published September 19, 2013. It was updated on September 19, 2017.] Python 是一種高效的動態編程語言,廣泛應用于科學、工程和數據分析應用程序中。影響 python 流行的因素有很多,包括它簡潔而富有表現力的語法和標準的數據結構、全面的“包含電池”的標準庫、優秀的文檔、廣泛的庫和工具生態系統、專業支持的可用性以及大而開放的社區。不過,最重要的也許是 Python 這樣的動態類型化、解釋性語言所能實現的高生產率。 Python 既靈活又靈活,這使它成為快速原型設計和構建完整系統的優秀語言。 但是 Python 最大的優點也可能是它最大的弱點:

Source

]]>
214
在 CUDA C / C ++ 中使用共享內存 http://www.open-lab.net/zh-cn/blog/using-shared-memory-cuda-cc/ Mon, 28 Jan 2013 07:23:00 +0000 http://www.open-lab.net/zh-cn/blog/?p=218 Continued]]> 在 上一篇文章 中,我研究了如何將一組線程訪問的全局內存合并到一個事務中,以及對齊和跨步如何影響 CUDA 各代硬件的合并。對于最新版本的 CUDA 硬件,未對齊的數據訪問不是一個大問題。然而,不管 CUDA 硬件是如何產生的,在全局內存中大步前進都是有問題的,而且在許多情況下似乎是不可避免的,例如在訪問多維數組中沿第二個和更高維的元素時。但是,在這種情況下,如果我們使用共享內存,就可以合并內存訪問。在我在下一篇文章中向您展示如何避免跨越全局內存之前,首先我需要詳細描述一下共享內存。 因為它是片上的,共享內存比本地和全局內存快得多。實際上,共享內存延遲大約比未緩存的全局內存延遲低 100 倍(前提是線程之間沒有內存沖突,我們將在本文后面討論這個問題)。共享內存是按線程塊分配的,因此塊中的所有線程都可以訪問同一共享內存。

Source

]]>
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 +0000 http://www.open-lab.net/zh-cn/blog/?p=429 Continued]]> 在前面的 兩 文章 中,我們研究了如何在主機和設備之間高效地移動數據。在我們的 CUDA C / C ++系列的第六篇文章中,我們將討論如何有效地從內核中訪問設備存儲器,特別是 全局內存 。 在 CUDA 設備上有幾種內存,每種內存的作用域、生存期和緩存行為都不同。到目前為止,在本系列中,我們已經使用了駐留在設備 DRAM 中的 全局內存 ,用于主機和設備之間的傳輸,以及內核的數據輸入和輸出。這里的名稱 global 是指作用域,因為它可以從主機和設備訪問和修改。全局內存可以像下面代碼片段的第一行那樣使用 de Clara 說明符在全局(變量)范圍內聲明,或者使用 動態分配并分配給一個常規的 C 指針變量,如第 7 行所示。全局內存分配可以在應用程序的生命周期內保持。根據設備的 計算能力 ,全局內存可能被緩存在芯片上,也可能不在芯片上緩存。

Source

]]>
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 +0000 http://www.open-lab.net/zh-cn/blog/?p=432 Continued]]> 在上一期的 C / C ++ 文章 中,我們討論了如何在主機和設備之間高效地傳輸數據。在這篇文章中,我們討論了如何將數據傳輸與主機上的計算、設備上的計算相重疊,在某些情況下,主機和設備之間的其他數據傳輸。實現數據傳輸和其他操作之間的重疊需要使用 CUDA 流,所以首先讓我們了解一下流。 CUDA 中的 stream 是按照主機代碼發出的順序在設備上執行的操作序列。雖然流中的操作被保證按規定的順序執行,但是不同流中的操作可以被交錯,并且在可能的情況下,它們甚至可以并發運行。 CUDA 中的所有設備操作(內核和數據傳輸)都在一個流中運行。如果沒有指定流,則使用默認流(也稱為“空流”)。默認流與其他流不同,因為它是關于設備上操作的同步流:在所有先前發出的操作 在設備上的任何流中 完成之前,默認流中的任何操作都不會開始,

Source

]]>
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 +0000 http://www.open-lab.net/zh-cn/blog/?p=230 Continued]]> 在 C + C ++系列 之前的 帖子 中,我們為該系列的主要推力奠定了基礎:如何優化 CUDA C / C ++代碼。本文就如何在主機和主機之間高效地傳輸數據展開討論。設備內存和 GPU 之間的峰值帶寬遠高于主機內存和設備內存之間的峰值帶寬(例如,在 GPU NVIDIA C2050 上為 144 GB / s ),而在 PCIe x16 Gen2 上為 8 GB / s 。這種差異意味著主機和 GPU 設備之間的數據傳輸的實現可能會影響或破壞應用程序的整體性能。讓我們從主機數據傳輸的一般原則開始。 在這篇文章中,我們將研究上面的前三條準則,并在下一篇文章中專門討論重疊數據傳輸。首先,我想談談如何在不修改源代碼的情況下測量數據傳輸所花費的時間。 為了測量每次數據傳輸所花費的時間,我們可以在每次傳輸前后記錄一個 CUDA 事件,并使用 ,

Source

]]>
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 +0000 http://www.open-lab.net/zh-cn/blog/?p=396 Continued]]> 在 本系列文章的第一篇 中,我們通過檢查 CUDA C/C++ SAXPY 來研究 CUDA C / C ++的基本元素。在第二篇文章中,我們將討論如何分析這個和其他 CUDA C / C ++代碼的性能。我們將依賴于這些性能測量技術在未來的職位,性能優化將變得越來越重要。 CUDA 性能度量通常是從主機代碼中完成的,可以使用 CPU 計時器或 CUDA 特定計時器來實現。在討論這些性能度量技術之前,我們需要討論如何在主機和設備之間同步執行。 讓我們看看數據傳輸和來自 上一篇文章 的 SAXPY 主機代碼的內核啟動: 使用 在主機和設備之間的數據傳輸是 synchronous (或 blocking )傳輸。同步數據傳輸在之前發出的所有 CUDA 調用完成之前不會開始,后續的 CUDA 調用在同步傳輸完成之前無法開始。因此,

Source

]]>
396
CUDA C 和 C++ 的簡單介紹 http://www.open-lab.net/zh-cn/blog/easy-introduction-cuda-c-and-c/ Sun, 21 Oct 2012 07:54:00 +0000 http://www.open-lab.net/zh-cn/blog/?p=444 Continued]]> 本文是 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 及其存儲器。

Source

]]>
444
人人超碰97caoporen国产