Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wykonywanie obliczeń na GPU

Ostatnio zmodyfikowano 2017-11-20 07:32
Autor Wiadomość
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2014-10-07 22:14:15
Jako że dopiero się uczę programować,
zostawiam ten temat dla was jako bardziej
obeznanych w programowaniu ode mnie. :F
Nadal zostaję w tym stanie, mam nadzieję,
że kiedyś w przyszłości wrócę do tego tematu
i z niego skorzystam. :F

Jeśli coś ktoś wie coś więcej na ten temat
lub znalazł kurs związany z tym tematem
niech napisze co wie lub znalazł...
Z góry dziękuję!

Bez odbioru!
P-118119
DejaVu
» 2014-10-07 22:33:32
Ponoć warto się zainteresować biblioteką OpenCL bardziej aniżeli CUDA, ponieważ OpenCL umożliwia wykorzystanie każdego sprzętu, wspierającego obliczenia na GPU, natomiast CUDA jest tylko i wyłącznie dla kart z chipsetem/procesorem firmy NVidia.
P-118123
DejaVu
» 2014-10-09 02:56:56
Przekazywanie klasy do GPU (nie sprawdzałem jeszcze czy działa):
C/C++
class MyClass
{
public:
    int value;
    float rate;
    __device__ __host__ MyClass()
    {
        value = 0; rate = 0;
    }
    __device__ __host__ MyClass( int v, float r )
    {
        value = v; rate = r;
    }
    __device__ __host__ ~MyClass() { };
}
You then need to correctly allocate the device memory.If you want an array of MyClass with 10 members on the device, allocate and copy it to the device like this:

MyClass arr[ 10 ];
MyClass * darr;
const size_t sz = size_t( 10 ) * sizeof( MyClass );
cudaMalloc(( void ** ) & darr, sz );
cudaMemcpy( darr, & arr[ 0 ], sz, cudaMemcpyHostToDevice );

http://stackoverflow.com​/questions/14119088​/passing-a-class-object-to-a-kernel
P-118167
DejaVu
» 2014-10-10 22:58:22
No to mogę stwierdzić teraz, że da radę używać klas na GPU :) Nie można jednak używać override ani metod wirtualnych.
C/C++
class MyTask
    : public gpu::Task < MyTask >
{
public:
    __host__ __device__ MyTask( gpu::KernelCPU & _kernel )
        : Task( _kernel, this )
    {
    }
   
    __host__ void onInitAtCPU() override
    {
        for( int i = 0; i < 5; ++i )
        {
            a[ i ] = i + 1;
            b[ i ] = a[ i ] * 10;
            c[ i ] = 0;
        } //for
    }
   
    __device__ void onExecuteGPU()
    {
        int i = threadIdx.x;
        c[ i ] = a[ i ] + b[ i ];
    }
   
    __host__ void onFinishAtCPU() override
    {
        for( int i = 0; i < 5; ++i )
             printf( "a[%d] = %3d; b[%d] = %3d; b[%d] = %3d;\n", i, a[ i ], i, b[ i ], i, c[ i ] );
       
    }
private:
    int a[ 5 ];
    int b[ 5 ];
    int c[ 5 ];
}; //class MyTask

void UsageExample()
{
    gpu::KernelCPU kernel;
    MyTask mytask( kernel );
    kernel.run( mytask, 5, 1 );
}

A ponoć nie warto zabierać się za programowanie obiektowe przy GPU :P
P-118218
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2014-10-11 19:50:18
Gdybym tworzył grę typu http://pl.wikipedia.org/wiki​/First-person_shooter to czy warto
na przykład w przypadku serwera przenieść obliczenia
trajektorii pocisków na GPU czy zostawić na CPU?
P-118287
DejaVu
» 2014-10-11 19:59:39
Obliczenia na GPU przydają się tylko wtedy, gdy istnieje poważne uzasadnienie wykonania obliczeń, które zbyt dużo czasu zajmują na CPU. Teoretycznie masz stałą ilość danych wejściowych i stałą ilość danych wejściowych, jednak... takie obliczenia to niepotrzebne kompilacje i raczej zachowałbym moc obliczeniową GPU na shadery do efektów graficznych, aniżeli do fizyki gry. Utrzymywanie i rozwijanie kodu wykonującego się na GPU jest trudne, żmudne i męczące. Samo pisanie dużej gry jest samym w sobie trudnym przedsięwzięciem więc nie polecam Ci łączyć miliona różnych technologii, których nie znasz bo taki projekt po prostu upadnie zanim nabierze interesujących kształtów.
P-118289
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2014-10-12 19:00:45
GPU jest dobre do obliczeń rozproszonych (nie liniowych) wtedy jest najlepszym rozwiązaniem, nawet najlepsze procesory nie dorównują wtedy kartom graficznym
Obliczenia na GPU przydają się tylko wtedy, gdy istnieje poważne uzasadnienie wykonania obliczeń, które zbyt dużo czasu zajmują na CPU.

raczej zachowałbym moc obliczeniową GPU na shadery do efektów graficznych
...
w przypadku serwera

Wykorzystanie obliczeń na GPU specjalnie dla parunasto slotowego
serwera, byłoby uciążliwe, wręcz nie opłacalne i starczyłby tylko
zwykły CPU, tak jak ty to mówisz...

Jednak przy wykorzystaniu GPU można by z serwera wycisnąć więcej
slotów bez jakichkolwiek "ścinek i cofek" po stronie serwera.

W przypadku Minecrafta nie było by problemu z nadmiarem
bytów (np. spadającego piasku czy wybuchającego TNT),
co znacznie obciąża procesor.

To są tylko moje spekulacje...


Co więcej sam chciałem w pewnym momencie wykorzystać CUDA do zwiększenia wydajności aplikacji,
:C Mam nadzieję, że nie zmierzam w złym kierunku.
P-118367
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2014-10-20 17:27:46
Na serio to moje zdanie w tym temacie
nie powinno być brane pod uwagę, bo po
prostu ja się jeszcze na tym nie znam.
Możliwe, że sam w przyszłości będę się
śmiać z tego co powiedziałem.

Jak widać technologia się rozwija więc
może za te 2/3 lata będzie dostępna
biblioteka oraz kontenery umożliwiające
dynamiczne zarządzanie pamięcią na GPU.
Na pewno powstanie kiedyś biblioteka
wykorzystująca możliwości karty graficznej,
tak jak dla innych komponentów komputera.

Jakiś człowiek na pewno się
poświęci dla programistów.
P-119029
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona