cl_device_available

Hi all

I’d like to ask if anyone has ever managed to get meaningful results for the CL_DEVICE_AVAILABLE query on clGetDeviceInfo. Perhaps I’m doing this wrong (code below) but so far I have never seen a device flagged as unavailable!

I’m using a unix node with 4 Tesla S1070s, running in exclusive mode. The whole programme takes a long time, occupying a single GPU. I can run the programme on device 0, send it to the background and then run a second instance of the programme, this time on device 1. It works fine, but it reports that all devices are available, even though device 0 is in use. If I were to run the second instance of the programme on device 0 then they both crash (first instance CL_OUT_OF_RESOURCES, second instance CL_DEVICE_NOT_AVAILABLE). This is to be expected, the only puzzling behaviour is the CL_DEVICE_AVAILABLE flag in clGetDeviceInfo (unless I have misunderstood what this is actually supposed to do!)

Here’s the part of the programme that checks for availability:

cl_platform_id platform;

cl_device_id devs[100];

cl_uint ndevs = 0,  ret_num_platforms = 0;

cl_bool av[10];

char devname[2048];

clGetPlatformIDs(1,&platform,&ret_num_platforms);

clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 100, devs, &ndevs);

printf("Devices (availability):\n");

for(i = 0; (unsigned int)i < ndevs; i++)

{

	clGetDeviceInfo(devs[i],CL_DEVICE_AVAILABLE,sizeof(cl_bool),&av[i],NULL);

	clGetDeviceInfo(devs[i],CL_DEVICE_NAME,sizeof(devname),devname,NULL);

	printf("%d:\t%s (%d)\n",i,devname,av[i]);

}

I’d like to be able to check if a device is available before proceeding to create a command queue on that device. Is there a problem with how I’m querying this?

Thanks in advance for your time.

Gib

I’ve never used CL_DEVICE_AVAILABLE, but it seems to me that when you create your context before querying your devices, the nvidia driver alloc you only the available devices.
Not sure of it, but in your case, the second instance would only see 3 devices in his context.