Ich habe eine Multithreading-Anwendung, die die GPU verwendet, die von Natur aus single-threaded ist, und die tatsächlichen APIs, die ich verwende, cv::gpu::FAST_GPU
stürzt ab, wenn ich versuche, sie multi-threaded zu verwenden. so dass im Grunde habe ich:Bedingte Übernahme eines std :: mutex
static std::mutex s_FAST_GPU_mutex;
{
std::lock_guard<std::mutex> guard(s_FAST_GPU_mutex);
cv::gpu::FAST_GPU(/*params*/)(/*parameters*/);
}
nun den Code Benchmarking zeigt mir FAST_GPU()
in Isolation ist schneller als die CPU FAST()
, aber in der tatsächlichen Anwendung meine anderen Threads viel Zeit für die Sperre warten verbringen, so dass die Gesamt der Durchsatz ist schlechter.
Blick durch die Dokumentation und at this answer es scheint, dass dies möglich sein könnte:
static std::mutex s_FAST_GPU_mutex;
static std::unique_lock<std::mutex> s_FAST_GPU_lock(s_FAST_GPU_mutex, std::defer_lock);
{
// Create an unlocked guard
std::lock_guard<decltype(s_FAST_GPU_lock)> guard(s_FAST_GPU_lock, std::defer_lock);
if (s_FAST_GPU_lock.try_lock())
{
cv::gpu::FAST_GPU(/*params*/)(/*parameters*/);
}
else
{
cv::FAST(/*parameters*/);
}
}
Dies wird jedoch nicht kompiliert als std::lock_guard
nur eine std::adopt_lock
akzeptiert. Wie kann ich das richtig umsetzen?
Ich bin nicht Sicher, warum du einen statischen 'unique_lock' verwendest, da normalerweise nicht 2 Threads Zugriff auf denselben' unique_lock' haben sollen. Das heißt, ich würde die s_FAST_GPU_LOCK entfernen und dann 'std :: try_to_lock' verwenden und testen, ob es mit' ownes_lock' erfolgreich war. –
@DaveS Ahh, ich sehe - 'mutex.try_lock()' dann 'lock_guard <> (std :: adople_lock)'? Bitte mach das zu einer Antwort. –