Skip navigation

Eszköz Lekérdezések

Áttekintés

A CUDA programok futtatásakor néha nem árt tisztában lenni azzal, hogy milyen GPU-n is futtatjuk a programunkat. Ehhez különböző lekérdező függvények segítségével deríthetjük ki a GPU-nk tulajdonságait, és paramétereit.

Az első dolog amit érdemes lekérdezni, az a paraméterek száma. Ehhez használhatjuk a cudaGetDeviceCount(...) függvényt az alábbi módon.

    int count;

    cudaGetDeviceCount( &count );

A függvény bemenetül egy referenciát vár egy int változóra. A változó értékébe pedig beleteszi az elérhető CUDA GPU-k számát.

Ha tudjuk hány GPU van as zámítógépben, akkor részletesebb információkat is kérhetünk róluk. Ehhez használhatjuk a cudaGetDeviceProperties(...) függvényt.

    cudaDeviceProp prop;

    cudaGetDeviceProperties( &prop, i );

Ahogy láthatjuk a kódban is a függvény két paramétert vár. Az első egy referencia egy cudaDeviceProp típusú struktúrára. Ebben fogjuk visszakapni a paramétereket. A másik paraméter pedig annak a GPU-nak a sorszáma (0-tól kezdődően), amit le akarunk kérdezni.

Ha a lekérdezés kész, akkor a struktúrából kiolvashatjuka GPU paramétereit.

    printf( "   --- General Information for device %d ---\n", i );
    printf( "Name:  %s\n", prop.name );
    printf( "Compute capability:  %d.%d\n", prop.major, prop.minor );
    printf( "Clock rate:  %d\n", prop.clockRate );
    printf( "Device copy overlap:  " );
    if (prop.deviceOverlap)
        printf( "Enabled\n" );
    else
        printf( "Disabled\n");
    printf( "Kernel execution timeout :  " );
    if (prop.kernelExecTimeoutEnabled)
        printf( "Enabled\n" );
    else
        printf( "Disabled\n" );

    printf( "   --- Memory Information for device %d ---\n", i );
    printf( "Total global mem:  %ld\n", prop.totalGlobalMem );
    printf( "Total constant Mem:  %ld\n", prop.totalConstMem );
    printf( "Max mem pitch:  %ld\n", prop.memPitch );
    printf( "Texture Alignment:  %ld\n", prop.textureAlignment );

    printf( "   --- MP Information for device %d ---\n", i );
    printf( "Multiprocessor count:  %d\n",
                prop.multiProcessorCount );
    printf( "Shared mem per mp:  %ld\n", prop.sharedMemPerBlock );
    printf( "Registers per mp:  %d\n", prop.regsPerBlock );
    printf( "Threads in warp:  %d\n", prop.warpSize );
    printf( "Max threads per block:  %d\n",
                prop.maxThreadsPerBlock );
    printf( "Max thread dimensions:  (%d, %d, %d)\n",
                prop.maxThreadsDim[0], prop.maxThreadsDim[1],
                prop.maxThreadsDim[2] );
    printf( "Max grid dimensions:  (%d, %d, %d)\n",
                prop.maxGridSize[0], prop.maxGridSize[1],
                prop.maxGridSize[2] );

Teljes kód

A program teljes kódja elérhető ezen a linken, vagy lent látható.

#include <cuda.h>
#include <stdio.h>

int main( void ) {
    int count;
    cudaDeviceProp  prop;

    cudaGetDeviceCount( &count );

    for (int i=0; i< count; i++) {
        cudaGetDeviceProperties( &prop, i );
    
        printf( "   --- General Information for device %d ---\n", i );
        printf( "Name:  %s\n", prop.name );
        printf( "Compute capability:  %d.%d\n", prop.major, prop.minor );
        printf( "Clock rate:  %d\n", prop.clockRate );
        printf( "Device copy overlap:  " );
        if (prop.deviceOverlap)
            printf( "Enabled\n" );
        else
            printf( "Disabled\n");
        printf( "Kernel execution timeout :  " );
        if (prop.kernelExecTimeoutEnabled)
            printf( "Enabled\n" );
        else
            printf( "Disabled\n" );

        printf( "   --- Memory Information for device %d ---\n", i );
        printf( "Total global mem:  %ld\n", prop.totalGlobalMem );
        printf( "Total constant Mem:  %ld\n", prop.totalConstMem );
        printf( "Max mem pitch:  %ld\n", prop.memPitch );
        printf( "Texture Alignment:  %ld\n", prop.textureAlignment );

        printf( "   --- MP Information for device %d ---\n", i );
        printf( "Multiprocessor count:  %d\n",
                    prop.multiProcessorCount );
        printf( "Shared mem per mp:  %ld\n", prop.sharedMemPerBlock );
        printf( "Registers per mp:  %d\n", prop.regsPerBlock );
        printf( "Threads in warp:  %d\n", prop.warpSize );
        printf( "Max threads per block:  %d\n",
                    prop.maxThreadsPerBlock );
        printf( "Max thread dimensions:  (%d, %d, %d)\n",
                    prop.maxThreadsDim[0], prop.maxThreadsDim[1],
                    prop.maxThreadsDim[2] );
        printf( "Max grid dimensions:  (%d, %d, %d)\n",
                    prop.maxGridSize[0], prop.maxGridSize[1],
                    prop.maxGridSize[2] );
        printf( "\n" );
    }
}

Feladatok

  • Kérdezzük le a saját GPU-nk tulajdonságait!