|
|
@ -16,10 +16,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
#include "paddle/fluid/framework/ddim.h"
|
|
|
|
#include "paddle/fluid/framework/ddim.h"
|
|
|
|
#include "paddle/fluid/framework/lod_tensor_array.h"
|
|
|
|
#include "paddle/fluid/framework/lod_tensor_array.h"
|
|
|
|
|
|
|
|
#include "paddle/fluid/framework/threadpool.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace paddle {
|
|
|
|
namespace paddle {
|
|
|
|
namespace framework {
|
|
|
|
namespace framework {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static constexpr size_t kDoubleBufferSize = 3;
|
|
|
|
|
|
|
|
|
|
|
|
class ReaderBase {
|
|
|
|
class ReaderBase {
|
|
|
|
public:
|
|
|
|
public:
|
|
|
|
explicit ReaderBase(const std::vector<DDim>& shapes) : shapes_(shapes) {
|
|
|
|
explicit ReaderBase(const std::vector<DDim>& shapes) : shapes_(shapes) {
|
|
|
@ -135,6 +138,28 @@ class BatchReader : public DecoratedReader {
|
|
|
|
std::vector<std::vector<LoDTensor>> buffer_;
|
|
|
|
std::vector<std::vector<LoDTensor>> buffer_;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DoubleBufferReader : public DecoratedReader {
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
DoubleBufferReader(ReaderBase* reader)
|
|
|
|
|
|
|
|
: DecoratedReader(reader), buffer_(kDoubleBufferSize) {
|
|
|
|
|
|
|
|
framework::Async(std::bind(&DoubleBufferReader::ProducerThreadFunc, this));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ReadNext(std::vector<LoDTensor>* out) override;
|
|
|
|
|
|
|
|
bool HasNext() const override;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
void ProducerThreadFunc();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<std::vector<LoDTensor>> buffer_;
|
|
|
|
|
|
|
|
size_t write_pos_;
|
|
|
|
|
|
|
|
size_t read_pos_;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::mutex mtx_;
|
|
|
|
|
|
|
|
std::condition_variable buffer_not_full_;
|
|
|
|
|
|
|
|
std::condition_variable buffer_not_empty_;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// The ReaderHolder is used as readers' unified wrapper,
|
|
|
|
// The ReaderHolder is used as readers' unified wrapper,
|
|
|
|
// making it easier to access different type readers in Variables.
|
|
|
|
// making it easier to access different type readers in Variables.
|
|
|
|
class ReaderHolder {
|
|
|
|
class ReaderHolder {
|
|
|
|