Fix race condition creating ConverterResourceStore (#3419)

This commit is contained in:
Tiago Koji Castro Shibata 2020-04-04 20:10:07 -07:00 committed by GitHub
parent 33006f48c0
commit 517693a507
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 12 deletions

View file

@ -53,16 +53,12 @@ Windows::AI::MachineLearning::LearningModelDevice LearningModelDevice::CreateFro
WINML_CATCH_ALL
std::shared_ptr<::Windows::AI::MachineLearning::ConverterResourceStore> LearningModelDevice::TensorizerStore() {
if (m_tensorizerStore == nullptr) {
m_tensorizerStore = ::Windows::AI::MachineLearning::ConverterResourceStore::Create(5);
}
std::call_once(m_tensorizerStoreInitialized, [this](){ m_tensorizerStore = ::Windows::AI::MachineLearning::ConverterResourceStore::Create(5); });
return m_tensorizerStore;
}
std::shared_ptr<::Windows::AI::MachineLearning::ConverterResourceStore> LearningModelDevice::DetensorizerStore() {
if (m_detensorizerStore == nullptr) {
m_detensorizerStore = ::Windows::AI::MachineLearning::ConverterResourceStore::Create(5);
}
std::call_once(m_detensorizerStoreInitialized, [this](){ m_detensorizerStore = ::Windows::AI::MachineLearning::ConverterResourceStore::Create(5); });
return m_detensorizerStore;
}

View file

@ -84,7 +84,9 @@ struct LearningModelDevice : LearningModelDeviceT<LearningModelDevice, IMetacomm
bool m_isCpuDevice;
bool m_areMetacommandsEnabled = true;
std::shared_ptr<WinML::ConverterResourceStore> m_detensorizerStore;
std::once_flag m_detensorizerStoreInitialized;
std::shared_ptr<WinML::ConverterResourceStore> m_tensorizerStore;
std::once_flag m_tensorizerStoreInitialized;
std::unique_ptr<D3DDeviceCache> m_deviceCache;
};

View file

@ -250,9 +250,11 @@ void MultiThreadMultiSessionOnDevice(const LearningModelDevice& device) {
void MultiThreadMultiSession() {
MultiThreadMultiSessionOnDevice(LearningModelDeviceKind::Cpu);
if (GPUTEST_ENABLED) {
MultiThreadMultiSessionOnDevice(LearningModelDeviceKind::DirectX);
}
}
void MultiThreadMultiSessionGpu() {
GPUTEST
MultiThreadMultiSessionOnDevice(LearningModelDeviceKind::DirectX);
}
// Create different sessions for each thread, and evaluate
@ -318,9 +320,11 @@ void MultiThreadSingleSessionOnDevice(const LearningModelDevice& device) {
void MultiThreadSingleSession() {
MultiThreadSingleSessionOnDevice(LearningModelDeviceKind::Cpu);
if (GPUTEST_ENABLED) {
MultiThreadSingleSessionOnDevice(LearningModelDeviceKind::DirectX);
}
}
void MultiThreadSingleSessionGpu() {
GPUTEST
MultiThreadSingleSessionOnDevice(LearningModelDeviceKind::DirectX);
}
}
@ -330,7 +334,9 @@ const ConcurrencyTestsApi& getapi() {
LoadBindEvalSqueezenetRealDataWithValidationConcurrently,
MultiThreadLoadModel,
MultiThreadMultiSession,
MultiThreadMultiSessionGpu,
MultiThreadSingleSession,
MultiThreadSingleSessionGpu,
EvalAsyncDifferentModels,
EvalAsyncDifferentSessions,
EvalAsyncDifferentBindings

View file

@ -10,7 +10,9 @@ struct ConcurrencyTestsApi
VoidTest LoadBindEvalSqueezenetRealDataWithValidationConcurrently;
VoidTest MultiThreadLoadModel;
VoidTest MultiThreadMultiSession;
VoidTest MultiThreadMultiSessionGpu;
VoidTest MultiThreadSingleSession;
VoidTest MultiThreadSingleSessionGpu;
VoidTest EvalAsyncDifferentModels;
VoidTest EvalAsyncDifferentSessions;
VoidTest EvalAsyncDifferentBindings;
@ -21,7 +23,9 @@ WINML_TEST_CLASS_BEGIN_WITH_SETUP(ConcurrencyTests, ConcurrencyTestsApiSetup)
WINML_TEST(ConcurrencyTests, LoadBindEvalSqueezenetRealDataWithValidationConcurrently)
WINML_TEST(ConcurrencyTests, MultiThreadLoadModel)
WINML_TEST(ConcurrencyTests, MultiThreadMultiSession)
WINML_TEST(ConcurrencyTests, MultiThreadMultiSessionGpu)
WINML_TEST(ConcurrencyTests, MultiThreadSingleSession)
WINML_TEST(ConcurrencyTests, MultiThreadSingleSessionGpu)
WINML_TEST(ConcurrencyTests, EvalAsyncDifferentModels)
WINML_TEST(ConcurrencyTests, EvalAsyncDifferentSessions)
WINML_TEST(ConcurrencyTests, EvalAsyncDifferentBindings)