簡體   English   中英

何時以及為什么要在 CUDA 中使用 atomicInc()?

[英]When and why would you use atomicInc() in CUDA?

我一直在閱讀 CUDA 中的原子操作,而atomicInc()的更新模式似乎相當隨意。

來自CUDA 編程指南

 unsigned int atomicInc(unsigned int* address, unsigned int val);

讀取位於全局或共享內存中地址的 32 位字 old,計算 ((old >= val) ? 0 : (old+1)),並將結果存儲回同一地址的內存中。 這三個操作在一個原子事務中執行。 該函數返回舊的。

這是一個增量和“環繞”操作。 atomicInc(&x, val)x = (x+1) % (val+1)非常相似。

這對什么樣的應用程序有用? 這是 CUDA 編程中常見的代碼模式嗎? 如果是這樣,是否有專門的硬件來執行這個操作,這使得atomicInc()比使用atomicCAS()的等效操作更好?

這對什么樣的應用程序有用?

正如評論中所指出的,一種可能的應用是異步訪問環形緩沖區。 atomicInc具有翻轉特性意味着當消費者想要訪問超出環形緩沖區“結束”的元素時,索引(由atomicInc返回)將翻轉到開頭,即 0。雖然它不是環形緩沖區-緩沖區示例, 此處介紹了使用原子進行緩沖區訪問的想法。 atomicInc的環形緩沖區可能是對它的一個微不足道的擴展。 我不會提供有關環形緩沖區的教程。 例如,您可能會通過兩個都使用atomicInc()的不同例程分別維護一個輸入和一個輸出索引。

如果是這樣,是否有專門的硬件來執行這個操作,這使得 atomicInc()

根據我的經驗,它遠沒有atomicAdd的使用那么普遍。

如果是這樣,是否有專門的硬件來執行這個操作,這使得 atomicInc() 比使用 atomicCAS() 的等效操作更好?

是的,有專門的 (SASS) 指令和硬件。 盡管幾乎任何原子操作都可以使用atomicCAS “模擬”,但算術(在這種情況下,加 1 和翻轉檢查)不能直接由atomicCAS操作本身執行。 因此,要使用atomicCAS作為替代,有必要使用規范的測試循環方法。 通常,與使用不需要循環即可正確實現的專用指令相比,這效率較低且性能較差。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM