0

我想让 2 个评估在我创建的 2 个不同的设备(和 2 个不同的会话)上并行运行,为此我正在使用 EvaluateAsync()

代码:

std::cout<<"            Starting Evaluate           " << std::endl;

auto start = high_resolution_clock::now();

auto eval_1= session.EvaluateAsync(binding, L""();
auto eval_2 = session_2.EvaluateAsync( binding_2, L"" )

auto stop = high_resolution_clock::now();
auto duration = duration_cast<microseconds>( stop - start );

std::cout << "          Ending Evaluate         " << duration.count() << std::endl; 

预期行为:

只有一个评估调用(假设只有 auto eval_1= session.EvaluateAsync(binding, L""(); 在记录的时间之间),我知道持续时间是 10 毫秒。

如果 EvaluateAsyn 是真正异步的,我希望有 2 次调用,那么时间应该是 2 次调用中的最大值,但是,它需要两倍的时间,即 20 毫秒来执行。

4

1 回答 1

0

看起来在Windows 机器学习 GitHub 存储库中也提出了这个问题,并且那里有答案。综上所述,异步求值是复杂的,因为在 CPU 上某些算子仍然会尝试使用所有线程,这会导致争用,而在 GPU 上排队 GPU 工作的工作仍然是同步的,并且需要在 CPU 上运行的算子将导致管道在等待 GPU 工作时停止。

于 2020-12-16T20:43:41.080 回答