CUDA學習(六十二)

2021-09-21 03:28:59 字數 1910 閱讀 9246

流:

裝置執行時可以使用有名和無名(null)流。 命名流可以被執行緒塊內的任何執行緒使用,但是流控制代碼可能不會被傳遞給其他塊或子/父核心。 換句話說,乙個流應該被視為對它建立的塊是私有的。 流控制代碼不保證在塊之間是唯一的,因此在未分配塊的塊中使用流控制代碼將導致未定義的行為。

與主機端啟動類似,啟動到不同流中的工作可能會同時執行,但並不保證實際併發性。 cuda程式設計模型不支援依賴子核心之間的併發性的程式,並且具有未定義的行為。

裝置不支援主機端null流的跨流障礙語義(詳情見下文)。 為了保持與主機執行時的語義相容性,必須使用cudastreamcreatewithflags()api建立所有裝置流,並傳遞cudastreamnonblocking標誌。 cudastreamcreate()呼叫是僅用於主機執行時的api,並且無法為裝置編譯。

由於裝置執行時不支援cudastreamsynchronize()和cudastreamquery(),因此當應用程式需要知道流啟動的子核心已完成時,應該使用cudadevicesynchronize()。

隱式(null)流:

在主機程式中,未命名(null)流與其他流具有附加的屏障同步語義(詳情請參閱預設流)。 裝置執行時提供了乙個隱含的,未命名的流在乙個塊中的所有執行緒之間共享,但是由於所有命名流必須使用cudastreamnonblocking標誌建立,所以啟動到null流中的工作不會在任何其他流中插入對未決工作的隱式依賴。

事件:只支援cuda事件的流間同步功能。 這意味著支援cudastreamwaitevent(),但cudaeventsynchronize(),cudaeventelapsedtime()和cudaeventquery()不支援。 由於不支援cudaeventelapsedtime(),因此必須通過cudaeventcreatewithflags()建立cudaevents,並傳遞cudaeventdisabletiming標誌。

對於所有裝置執行時物件,事件物件可以在所有執行緒之間共享,而執行緒塊則建立它們,但是對於該塊是本地的,並且可能不會傳遞給其他核心或同一核心中的塊之間。 不保證事件控制代碼在塊之間是唯一的,因此在未建立塊的塊中使用事件控制代碼將導致未定義的行為。

同步:cudadevicesynchronize()函式將同步執行緒塊中任何執行緒啟動的所有工作,直到呼叫cudadevicesynchronize()為止。 請注意,cudadevicesynchronize()可以從發散的**中呼叫(請參閱阻止寬同步)。

如果呼叫執行緒用於與從其他執行緒呼叫的子網格同步,則由程式執行足夠的附加執行緒間同步,例如通過呼叫__syncthreads()

塊寬同步:

cudadevicesynchronize()函式並不意味著塊內同步。 特別是,如果沒有通過__syncthreads()指令進行顯式同步,則呼叫執行緒不會對任何其他執行緒發起的工作做出任何假設。 例如,如果乙個塊中的多個執行緒每次都啟動工作,並且同時希望所有這些工作同步(可能是因為基於事件的依賴性),則由程式決定,在呼叫cudadevicesynchronize之前,所有執行緒都會提交此工作()。

因為允許實現從塊中任何執行緒的啟動進行同步,所以很有可能多個執行緒對cudadevicesynchronize()的同時呼叫將耗盡第乙個呼叫中的所有工作,然後對以後的呼叫沒有影響。

裝置管理:

只有執行核心的裝置才能從該核心控制。 這意味著裝置執行時不支援裝置api,如cudasetdevice()。 從gpu看到的活動裝置(從cudagetdevice()返回)將具有與主機系統相同的裝置編號。 cudadevicegetattribute()呼叫可以請求關於另乙個裝置的資訊,因為該api允許將裝置id指定為該呼叫的引數。 請注意,catch-all cudagetdeviceproperties()api不是由裝置執行時提供的 - 必須單獨查詢屬性。

六十二 移位的用法

弱弱的問個問題,unsigned char的資料左移八位是不是等於0比如說a,b是 unsigned char的,c是unsigned int的,c a 8 b a會不會因為只有8位左移八位後就變成0了?答 1.unsigned char的資料左移八位,那麼低八位會變成02.c a 8 b 因為左邊...

CUDA學習(六十)

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

愛情六十二課,給默契留點時間

你什麼意思啊?你跟我說清楚,你到底是什麼意思啊 女友追問這句話已經乙個多小時了,宇翔煩感糾結,低頭不語 在街上常常能看見這樣吵架的情侶,一方拽著另一方責問 你什麼意思啊?ta什麼意思,你難道不知道嗎?愛人是那麼親近的另乙個人,他們更像一本塵封的書,需要去讀,而不是問。我們對彼此的了解,淺層的是對話,...