I’ve been trying to get the Direct3D Interoperability working on CUDA, however all Direct3D Interoperability functions are returning cudaErrorUnknown.
I’m using an ASUS N61JV notebook with Optimus (Intel GMA & Geforce GT 325M) and I’m using the latest drivers from the Optimus homepage (the original preinstalled drivers show the exact same results).
What I did:
I read the CUDA Optimus guide and first created a driver profile for the application.
Then I create the Direct3D Device and call cudaD3D10SetDirect3DDevice which succeeds according to the return value.
Then I try to call cudaD3D10RegisterResource but it returns cudaErrorUnknown.
I also tried the Driver API but I get the same result. Calling cuD3D10CtxCreate results in an unknown error.
I am sure that DirectX is using the Geforce and not the Intel GPU because of the rendering speed and a call to cudaGetDeviceProperties returns the correct values for the GT325 too.
The CUDA Optimus guide says to refer to the simpleD3D10 sample from the CUDA SDK … which doesn’t work.
It calls cudaD3D10GetDevice which fails with cudaErrorUnknown and therefore it can’t create the device.
I read in the Optimus guide that this is a requirement for getting it to work:
Application is not directly linked against cuda.lib or cudart.lib or LoadLibrary to dynamically load the nvcuda.dll or cudart*.dll and uses GetProcAddress to retrieve function addresses from nvcuda.dll or cudart*.dll.
I have to admit: I don’t understand that. I am not supposed to link against the libs AND I am not supposed to use LoadLibrary/GetProcAddress? So what am I supposed to use? I tried both and both show the same error.
I’m really stuck here. Maybe someone can tell me what I am doing wrong.
EDIT: seems like it is not only the Direct3D 10 Interoperability. cudaMalloc also fails with cudaErrorUnknown when running on the device. In emulation mode I get cudaSuccess and it seems to work. no difference between x86 and x64 versions of the cuda toolking and sdk. both show the same behaviour.