Free Fragen allgemein un Opencl(GPU speicher Zeiger)



  • Hallo zusammen!

    In meinem OpenCl Projekt ist mir nicht wirklich klar geworden... was passiert 😃
    ich allokiere manche , Arrays z.B. so :

    int InitialData1[DATA_SIZE_] = {38,50,54,50,56,0,43,43,74,71,32,36,16,43,56,100,50,25,15,17};
    

    aber danach mit
    free(InitialData1);
    habe ich eine Fehler weil InitialData1 nicht in Heap allokiert wurde.

    Trotzdem aber kann ich die Referenz "InitialData1" wie ein normalen Zeiger

    (in Heap) benützen um den Array ins GPU umzukopieren 😮

    Weiter, die Ausgabe des Kernels krige ich von Argument:

    ...
    cl::Buffer vectorOut (context, CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, sizeOfDataSize,NULL,&err);// Output -Buffer deklarieren, der in Host(nomalen
    // Speicher) automatischallokiert wird. Oder nicht?
    
    ...
    	kernel.setArg(2,vectorOut);// kernel argument setzen
    ...
    
    int * deviceDataOut = (int *)queue.enqueueMapBuffer(vectorOut,CL_FALSE,CL_MAP_READ,0,sizeOfDataSize,NULL,NULL,&err);// zeiger auf ausgabe- Array zu kriegen
    ...
    
    int * HostOutputVector = new int[DATA_SIZE_];// beachtet nicht auf Syntax
    // oder  Grösse von Arrays, da ist alles richtig
    
    memcpy(HostOutputVector,deviceDataOut,sizeOfDataSize);
    

    Liegt HostOutputVector in Stack oder Heap ? Und deviceDataOut -> in GPU globalen Speicher, oder im Heap?
    Komisch ist, dass nach diesem memcpy in HostOutputVector liegt Schrott 0o. Dies passirt aber nicht wenn ich

    dabei z.B:

    fill_n(deviceDataOut,DATA_SIZE_,24);

    für Testen mache,dann wird deviceDataOut nach HostOutputVector kopiert.Also ,

    ist deviceDataOut dann keine normale Referenz, auf die man zwar von Host

    normal zugreifen ( deviceDataOut[x]]; kann aber nicht umkopieren ?



  • o4kareg schrieb:

    aber danach mit
    free(InitialData1);
    habe ich eine Fehler weil InitialData1 nicht in Heap allokiert wurde.

    Das ist richtig, InitialData1 liegt auf dem Stack.
    Wenn die Funktion, in der InitialData1 definiert wurde beendet wird, wird auch InitialData1 ungültig.

    o4kareg schrieb:

    Trotzdem aber kann ich die Referenz "InitialData1" wie ein normalen Zeiger

    (in Heap) benützen um den Array ins GPU umzukopieren 😮

    Ja, das ist C. Nochmal nachlesen: Arrays und Zeiger.
    Wobei Heap und Stack auch im RAM liegen.

    Zum Rest kann ich dir nichts sagen, da ich queue.enqueueMapBuffer nicht kenne und das new doch nach C++ aussieht. 🙄



  • o4kareg schrieb:

    aber danach mit
    free(InitialData1);
    habe ich eine Fehler weil InitialData1 nicht in Heap allokiert wurde.

    Trotzdem aber kann ich die Referenz "InitialData1" wie ein normalen Zeiger

    (in Heap) benützen um den Array ins GPU umzukopieren

    Du darfst keinen Arrayspeicher mit free freigeben.
    Trenne dich mal von "Heap/Stack" usw., das macht der Compiler für sich selbst eh letztendlich so, wie der Compilerbauer es sich gerade gedacht hat, beides sind nur Anschauuungsmodelle zum Verständnis für Compilernutzer und nicht normiert/standardisiert.


Anmelden zum Antworten