MXNet: wait_to_read 方法
wait_to_read
在mxnet中,類ndarray
可以呼叫 wait_to_read
,官方給出的該函式解釋是:
Waits until all previous write operations on the current array are finished.
This method guarantees that all previous write operations that pushed
into the backend engine for execution are actually finished.
Examples
>>> import time
>>> tic = time.time()
>>> a = mx.nd.ones((1000,1000))
>>> b = mx.nd.dot(a, a)
>>> print(time.time() - tic) # doctest: +SKIP
0.003854036331176758
>>> b.wait_to_read()
>>> print(time.time() - tic) # doctest: +SKIP
0.0893700122833252
翻譯過來就是,呼叫該方法可以保證,之前進行的該ndarray的所有寫操作都完成了。由於MXNet是一個非同步框架,我們使用python介面呼叫方法的時候,只是將該方法push給了執行者,由執行者來安排什麼時候執行。所以,我們就無法知道,某一個操作是不是完成了。
那麼,在知道了該方法的功能後,我們的疑問就變成了,mxnet是怎麼做到的呢?
在mxnet的類ndarray中定義了WaitToRead
方法,如下:
inline void WaitToRead() const {
if (is_none()) return;
Engine::Get()->WaitForVar(ptr_->var);
}
其中ptr_->var
指向了該ndarray例項對應的唯一的var
,engine會根據該var
來進行判斷,當前操作對應的是哪個ndarray。
那麼,我們只需要知道Engine
對應的WariForVar
做了什麼就好了。在mxnet中實現了很多種engine
。但是我們用的engine都繼承了類ThreadedEngine
的WaitForVar
方法。沒有過載。
在這個方法裡面,主要做了一件事情,就是將一個操作push給了engine。
該操作需要完成的函式是:
this, &done](RunContext, CallbackOnComplete on_complete) {
if (engine_info_) {
LOG(INFO) << "Sync is executed";
}
{
std::unique_lock<std::mutex> lock{finished_m_};
done.store(true);
}
finished_cv_.notify_all();
if (engine_info_) {
LOG(INFO) << "Sync is notified";
}
on_complete();
}
輸出是var
。
函式將done
賦值為true,它被初始化為false。之後會呼叫finished_cv_.notify_all();
來通知該方法繼續執行。
因為,該方法會在將操作push之後,呼叫
{
std::unique_lock<std::mutex> lock{finished_m_};
finished_cv_.wait(lock, [this, &done]() {
return done.load() || kill_.load();
});
}
導致一直等待,直到done
為true。
到這裡,我們大概明白了ndarray的wait_to_read
的方法如何實現等待。
總體思路就是,呼叫了engine的WaitForVar方法。這個方法會將一個操作非同步push給engine,這個操作將一個原子變數done從false改變為true。由於push是非同步的,它會立刻返回,返回後,WaitForVar一直等待,知道done為true。
而engine會根據變數來安排執行,由於這次push的操作的輸出是ndarray對應的var,因此,engine會保證所有之前的寫入操作完成。
相關文章
- Caffe轉mxnet模型——mxnet工具模型
- MXNet: Barrier
- MXnet轉caffe
- Caffe轉mxnet模型——mmdnn模型DNN
- insightface之mxnet model轉caffemodel
- 深度框架 MXNet/Gluon 初體驗框架
- MXNET:多層神經網路神經網路
- 使用mmdnn將MXNET轉成Tensorflow模型DNN模型
- Mxnet R FCN 訓練自己的資料集
- mxnet資料格式轉換為tensorflow,pytorch資料PyTorch
- Mxnet-R-FCN-訓練自己的資料集
- MxNet預訓練模型到Pytorch模型的轉換模型PyTorch
- 快速入門MXBoard:MXNet資料視覺化工具視覺化
- Mxnet模型檔案轉換為Pb模型檔案模型
- 雲上深度學習實踐分享——雲上MXNet實踐深度學習
- 使用Mxnet基於skip-gram模型實現word2vect模型
- 從VGG到ResNet,你想要的MXNet預訓練模型輕鬆學模型
- Mxnet模型轉化為ncnn模型,並驗證轉化正確性模型CNN
- MXNet的資料格式轉化為tensorflow訓練用的資料格式
- 基於MXNET框架的線性迴歸從零實現(房價預測為例)框架
- MXNet 0.11釋出,加入動態圖介面Gluon,還有兩位CMU教授的親筆教程
- 手把手 | Apache MXNet助力數字營銷,檢測社交網路照片中的商標品牌Apache
- Mxnet速查_CPU和GPU的mnist預測訓練_模型匯出_模型匯入再預測_匯出onnx並預測GPU模型
- Java中parse方法,ValueOf方法,toString方法Java
- Java的方法靜態方法Java
- js includes方法 和 filter方法JSFilter
- 方法
- initialize方法與load方法比較
- Java System類,currentTimeMillis方法,arraycopy方法。Java
- Java方法03:方法的過載Java
- [方法]需求挖掘採集的方法
- javaSE-day04--ArrayList基本用方法、類內定義方法和方法過載、靜態方法static(類的方法)、工具方法(static)的定義和使用Java
- wait()方法與await()方法的區別AI
- Python - 物件導向程式設計 - 例項方法、靜態方法、類方法Python物件程式設計
- getPropertyPriority() 方法
- deleteRule() 方法delete
- getPropertyValue() 方法
- getBoundingClientRect() 方法GCclient