essay on programming languages, computer science, information techonlogies and all.

Saturday, February 23, 2013

OpenCL - Multiple SDKs

As there are multiple vendors supports OpenCL, multiple devices should be able to be loaded up in an application with one of vendor's OpenCL SDK.

Here I have NVidia CUDA SDK & Intel OpenCL SDK installed in my machine. And here is code to enumerate all the devices in all the platforms.

  vector< cl::Platform > platforms;  

  try 
  {
    cl::Platform::get( &platforms );

    for( cl_uint n=0; n < platforms.size(); ++n )
    {
      string platformName = platforms[n].getInfo< CL_PLATFORM_NAME >();
      cout << "Platform : @ " << platformName.c_str() << endl;
      
      vector< cl::Device > devices, ctxDevices;

      platforms[n].getDevices( CL_DEVICE_TYPE_ALL, &devices );
      
      cl::Context context( devices );
      ctxDevices = context.getInfo< CL_CONTEXT_DEVICES >();
      for( cl_uint i=0; i < ctxDevices.size(); ++i )
      {
        string deviceName = ctxDevices[i].getInfo< CL_DEVICE_NAME >();
        cout << "Device: @ " << deviceName.c_str() << endl;
      }
    }
  }
  catch( cl::Error e ) {
    cout << e.what() << ": Error Code " << e.err() << endl;
  }
 
Above code is linked with library OpenCL.lib come with NVidia CUDA SDK. It prints out below which enumerate all the OpenCL enabled devices incluing Intel OpenCL device.
 
Platform : @ NVIDIA CUDA
Device: @ GeForce GT 640
Platform : @ Intel(R) OpenCL
Device: @         Intel(R) Pentium(R) CPU G2120 @ 3.10GHz

This collaboration is based on the registery key \HKLM\SOFTWARE\Khronos\OpenCL\Vendors . Refer below.  I guess OpenCL.lib must loadup all these dll and asks to communicate it's devices under control.

No comments: