Writing real-world multi-threaded apps to capture, process and display video data in real-time is probably, in fairness, a slightly advanced topic. But after a fair amount of experimentation and frustration I think i can offer a piece of advise to other would-be image processing engineers embarking on a CUDA project:
Basically, don't use the CUDA runtime API in a real-time multi-threaded imaging application. And definately dont use the CUDA runtime API with OpenGL interop in a real-time multi-threaded imaging application.
You can just about get away with using the runtime API in a multi-threaded app IF you restrict your app so that only one host thread ever touches CUDA. Thats not usually possible in a real-time imaging system with interrupt driven capture callbacks and an asynchronous processing and display architecture. If you persist with the runtime API then...
Bad Things Can Happen
Under the hood, the runtime API is creating a CUDA context and attaching it to the first thread that touched CUDA. From then on, only that host thread should touch and CUDA API function, and if that thread terminates before CUDA resources are deallocated then bad things can happen. Alternatively, if you allocate some device memory in your application start-up, but then try and access or process that memory in a capture callback thread, then once again bad things can happen. Worst of all, if OpenGL interop tries to do something on a separate thread, whilst your capture callback is doing something on another thread then some CUDA operations may work, but sometimes very bad things can happen. For instance, I was quite successfully and repeatably able to instantly reboot my PC by running a badly coded piece of multi-threaded CUDA code with OpenGL interop. It was probably my fault, but that is difficult one to debug.
This is what led me to use the Driver API in all subsequent imaging applications and really take control over which host thread owned and used the CUDA context. So far, no problems. No crashes.
Vision Experts
Job for a rule-loving engineer?
9 years ago
No comments:
Post a Comment