lundi 27 février 2017

Structure defined in a dynamically loaded library

I am dynamically loading the cudart (Cuda Run Time Library) to access just the cudaGetDeviceProperties function. This one requires two arguments:

  • A cudaDeviceProp structure which is defined in a header of the run time library;
  • An integer which represents the device ID.

I am not including the cuda_runtime.h header in order to not get extra constants, macros, enum, class... that I do not want to use.

However, I need the cudaDeviceProp structure. Is there a way to get it without redefining it? I wrote the following code:

struct cudaDeviceProp;

class CudaRTGPUInfoDL
{   
    typedef int(*CudaDriverVersion)(int*);
    typedef int(*CudaRunTimeVersion)(int*);
    typedef int(*CudaDeviceProperties)(cudaDeviceProp*,int);

public:
    struct Properties
    {
        char   name[256];                           /**< ASCII string identifying device */
        size_t totalGlobalMem;                      /**< Global memory available on device in bytes */
        size_t sharedMemPerBlock;                   /**< Shared memory available per block in bytes */
        int    regsPerBlock;                        /**< 32-bit registers available per block */
        int    warpSize;                            /**< Warp size in threads */
        size_t memPitch;                            /**< Maximum pitch in bytes allowed by memory copies */
        /*... Tons of members follow..*/
    };

public:
CudaRTGPUInfoDL();
~CudaRTGPUInfoDL();

int getCudaDriverVersion();
int getCudaRunTimeVersion();
const Properties& getCudaDeviceProperties();

private:
    QLibrary                library;

private:
    CudaDriverVersion       cuDriverVer;
    CudaRunTimeVersion      cuRTVer;
    CudaDeviceProperties    cuDeviceProp;

    Properties              properties;
};

As everybody can see, I simply "copy-pasted" the declaration of the structure.

In order to get the GPU properties, I simply use this method:

const CudaRTGPUInfoDL::Properties& CudaRTGPUInfoDL::getCudaDeviceProperties()
{
    // Unsafe but needed.
    cuDeviceProp(reinterpret_cast<cudaDeviceProp*>(&properties), 0);
    return properties;
}

Thanks for your answers.

Aucun commentaire:

Enregistrer un commentaire