CUDA學習(五十)

2021-09-21 07:51:45 字數 1837 閱讀 9530

格式說明符:

至於標準printf(),格式說明符的格式為:%[flags] [width] [.precision] [size] type

支援以下字段(有關所有行為的完整說明,請參閱廣泛可用的文件):

請注意,cuda的printf()將接受標誌,寬度,精度,大小和型別的任意組合,不管它們是否總體上形成有效的格式說明符。 換句話說,「%hd」將被接受,並且printf將在引數列表中的相應位置期待乙個雙精度變數。

限制:printf()輸出的最終格式在主機系統上進行。 這意味著格式字串必須被主機系統的編譯器和c庫理解。 我們盡力確保cuda的printf函式支援的格式說明符構成最常見主機編譯器的通用子集,但確切的行為將取決於主機作業系統。

如格式說明符中所述,printf()將接受有效標誌和型別的所有組合。 這是因為它無法確定在最終輸出格式化的主機系統上什麼將會有效並且無效。 這樣做的效果是,如果程式發出包含無效組合的格式字串,則輸出可能不確定。

除格式字串外,printf()命令最多可以接受32個引數。 除此之外的其他引數將被忽略,並且格式說明符按原樣輸出。

由於64位windows平台上的長型別(64位windows平台上的四個位元組,其他64位平台上的八個位元組)的大小不同,這是乙個在非windows 64位機器上編譯的核心,但是 那麼在win64機器上執行將會看到包含「%ld」的所有格式字串的損壞輸出。 建議編譯平台匹配執行平台以確保安全。

在核心啟動之前,printf()的輸出緩衝區設定為固定大小(請參閱關聯的主機端api)。 它是迴圈的,如果在核心執行過程中產生的輸出比在緩衝區中更多,那麼舊的輸出將被覆蓋。 只有在執行其中一項操作時才會重新整理它:

請注意,程式退出時,緩衝區不會自動重新整理。 使用者必須顯式呼叫cudadevicereset()或cuctxdestroy(),如下例所示。

內部printf()使用共享資料結構,因此呼叫printf()可能會更改執行緒的執行順序。 特別是,呼叫printf()的執行緒可能比不呼叫printf()的執行緒執行時間更長,並且該路徑長度取決於printf()的引數。 但是,請注意,除明確的__syncthreads()障礙外,cuda不保證執行緒執行順序,因此無法判斷執行順序是否已由printf()修改或通過硬體中的其他排程行為。

關聯的主機端api:

以下api函式獲取並設定用於將printf()引數和內部元資料傳輸到主機的緩衝區的大小(預設值為1兆位元組):

例子:

#include __global__ void hellocuda(float f)

int main()

結果:

hello thread 2, f=1.2345

hello thread 1, f=1.2345

hello thread 4, f=1.2345

hello thread 0, f=1.2345

hello thread 3, f=1.2345

注意每個執行緒是如何遇到printf()命令的,因此輸出的行數與網格中啟動的執行緒數一樣多。 正如預期的那樣,全域性值(即float f)在所有執行緒之間是公共的,並且本地值(即threadidx.x)不同於每個執行緒。

#include __global__ void hellocuda(float f)

int main()

結果:

hello thread 0, f=1.2345
不言而喻,if()語句限制了哪些執行緒將呼叫printf,以便只能看到一行輸出。

日語五十音入門學習

五十音的學習 五十音超級簡單,你看,就這麼多,當然是騙你的了hhhh 不過放心,也不是很多 日語中還有平假名和片假名之分。平假名用來書寫本國詞彙,而片假名則用來書寫外來詞彙。平假名,它是由48個字構成,早期多為女性所用,常用做抒情。而現在主要用來寫日本本國所產生的詞彙,或者作為語法助詞來使用,有時也...

CUDA學習資源

之前沒有接觸過cuda,由於深度學習跟cuda的關係,本篇收集一些相關資料,有個認識,後面一點點學習吧 cuda,全名 compute unified device architecture,是nvidia公司基於圖形處理器gpus graphics processing units 開發的平行計算...

CUDA學習(六十)

排序和併發 裝置執行時的核心啟動順序遵循cuda stream排序語義。在乙個執行緒塊內,所有核心啟動到同乙個流中都會按順序執行。由於同一執行緒塊中的多個執行緒啟動到同乙個流中,流內的排序取決於該塊內的執行緒排程,這可以通過同步原語來控制,例如 syncthreads 請注意,因為流由執行緒塊內的所...