主機上非空流是非同步流,其上所有的操作都不會阻塞主機執行。相應地,隱式的空流是同步流,大多數新增到空流上的操作都會導致主機在先前所有的操作產生阻塞。二.
雖然非空流上在主機上是非阻塞的,但非空流內的操作可以被空流中操作所阻塞。因此可將非空流分為:阻塞和非阻塞兩種。
如果非空流是阻塞流,則空流可以阻塞該非空流中的操作。
如果非空流是非阻塞流,則它不會阻塞空流中的操作。
三,cudastreamcreate
建立的流是阻塞流,這就意味著流中操作可被阻塞,直到空流中的操作完成,直到空流的執行結束。
空流是隱式的同步流,在相同的
cuda
上下文情況下,它會和其他所有的阻塞流同步。
四.(1)
當操作被發布到空流中時,在操作被執行之前,
cuda
上下文會等待所有先前操作發布到所有的阻塞流中。
(2)當操作被發布到阻塞流中時,在操作執行之前,都會被掛起,直至空流中的操作完成。
示例:(1)阻塞流的阻塞行為:
const int n =3;
cudastream_t *stream = (cudastream_t*)malloc(sizeof(cudastream_t)*n);
for (int i = 0; i < n; i++)
kernel1 << <1,1,0,stream[0]>> > (); //非空流+阻塞流
kernel2 << <1, 1>> > (); //空流
kernel3 << <1, 1, 0, stream[1] >> > ();//非空流+阻塞流
for (int i = 0; i < n; i++)
執行順序,
kernl2只有在kernel1執行結束後,
kernl3只有在kernel2執行結束後,才會執行。非空流中的阻塞流與空流產生阻塞行。當然,從主機的角度來看,所有kernel都是非同步且非阻塞的。 視覺化效能分析器(nvvp)如圖:
(2)阻塞流的非阻塞行為:
為了消除非空流對空流的阻塞行為,可採用cudastreamcreatewithflags(&stream[i], unsiged int flag)進行初始化,flag可取值為[cudastreamdefault,cudastreamnonblocking];前者阻塞與cudactreate一樣,後者可使得非空流的阻塞行為消失。**和效能分析結果如圖:
從圖中可以看出,非空流與空流之間並不會產生阻塞影響,都無需等待其他核函式的執行結束。
什麼是阻塞式和非阻塞io流
阻塞io socket 的阻塞模式意味著必須要做完io 操作 包括錯誤 才會返回。非阻塞io 非阻塞模式下無論操作是否完成都會立刻返回,需要通過其他方式來判斷具體操作是否成功。兩者區別 所謂阻塞方式的意思是指,當試圖對該檔案描述符進行讀寫時,如果當時沒有東西可讀,或者暫時不可寫,程式就進入等待 狀態...
verilog中的阻塞與非阻塞
初學verilog的同學容易搞混淆阻塞與非阻塞賦值操作。要區分的話,其實也有辦法。學過數位電路的都知道時序的概念,比暫存器的操作,把d端輸入用clk打入暫存器,在clk時鐘上公升沿取樣d值,只有在時鐘上公升沿的下一週期的上公升沿,d值才會在輸出端q上輸出出來。符合這個特徵的就是非阻塞賦值 alway...
Java中的IO流之字元流
看完了位元組流 接下來我們來了解一下字元流 字元流字元流是可以直接讀寫字元的io流,用字元流來讀取字元時,先讀取到位元組資料,然後轉為字元。寫出字元時,需要把字元轉為位元組再寫出。還是上 吧 filereader filereader 類中的 read 方法可以按照字元大小讀取 這樣就把文字中的文字...