DirectX 9 + Multi-GPU

Hi,

Last week I wrote a raytracer (CUDA SDK 2.1) that run on CUDA device. I exploit the DirectX 9 interoperability (starting from the simpleD3D9Texture sample of the SDK) such that the raytracer store pixels directly into a texture surface. My next step is to distribute this on two (or more) GPUs. Looking at the code and the documentation isn’t clear if I can use the second GPU to render in the same texture. The programming guide say: “A CUDA context may interoperate with only one Direct3D device at a time and the CUDA context and Direct3D device must be created on the same GPU”. So, there is no way to exploit my multiple GPU system when use DirectX 9 interoperability?

Best Regard,

  • AGPX

P.S.: I found a bug in the simpleD3D9Texture code:

HRESULT InitD3D9(HWND hWnd) 

{

	// Create the D3D object.

	if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )

		return E_FAIL;

	// Get primary display identifier

	D3DADAPTER_IDENTIFIER9 adapterId;

	// Find the first CUDA capable device

	unsigned int adapter;

	for (adapter = 0; adapter < g_pD3D->GetAdapterCount(); adapter++)

	{

		D3DADAPTER_IDENTIFIER9 ident;

		int device;

		g_pD3D->GetAdapterIdentifier(adapter, 0, &adapterId);

		cudaD3D9GetDevice(&device, ident.DeviceName);

		if (cudaSuccess == cudaGetLastError()) break;

	}

	...

}

The line:

[font=“Courier New”]

cudaD3D9GetDevice(&device, ident.DeviceName);[/font]

make use of the unused variable ident. Instead, that line should be:

[font=“Courier New”]

cudaD3D9GetDevice(&device, adapterId.DeviceName);[/font]

replacing ident with adapterId.