zeratax / yacx

Yet Another CudaExecutor - wrapper to easily compile and execute cuda kernels
https://zeratax.github.io/yacx
MIT License
8 stars 4 forks source link

CUDA-SAFE-CALL #19

Closed LukasSiefke closed 4 years ago

LukasSiefke commented 5 years ago

Die Funktion funktioniert nicht und verursacht SIGSEGV-Error z.B. bei Ausführung von example_saxpy Kernel.cpp Zeile 83

zeratax commented 5 years ago

dann doch eher cuModuleUnload(_module). CUDA_SAFE_CALL wird ja schon vorher tausend mal aufgerufen und guckt eig nur ob der return wert in dem CUresult enum ist und wirft dann die passende exception?

LukasSiefke commented 5 years ago

Ne, es liegt an SAFE_CALL Das liegt daran, dass dort ein Error (201) von der CUDA-Funktion geworfern wird. Wird dann die CUDA_SAFE_CALL Methode aufgerufen gibt es ein SIGSEGV-Error und das Programm stürtzt ab. Aber wenn man ein try catch Block drum macht tritt kein SIGSEGV-Error auf und die Exception wird scheinbar normal geworfen und danach stürzt das Programm mit einem anderen Fehler (exit Code 255) ab. Gleiches passiert, wenn man die CUDA_SAFE_CALL weglässt.

LukasSiefke commented 5 years ago

Dann funktioniert sie vieleicht doch, aber wieso tritt ein SIGSEGV auf, falls die Exception nicht mit einem try-catch aufgefangen wird?

zeratax commented 5 years ago

Also falls es

Process finished with exit code 134 (interrupted by signal 6: SIGABRT)

Ist macht das ja Sinn, eine nicht gecatched exception soll das Program ja terminieren, aber dann hat die main ja nie, return 0 bekommen, wurde also nicht richtig beendet.

Hmm aber die Zeile ist doch von der launch funktion die in einem try-catch block aufgerufen wird?

example_saxpy:

...
try {
    ...
    program.kernel("saxpy")
        .compile()
        .configure(grid, block)
        .launch(program_args); // <---- CUDA_SAFE_CALL(cuModuleUnload(_module));
  } catch (const std::exception &e) {
    std::cerr << e.what() << std::endl;
  }
...

Edit: sorry, ja mit SIGSEGV sollte das nichts zu tun haben

zeratax commented 5 years ago

bei mir sehe ich auch nie, dass das letze argument vom device befreit wird, also cuMemFree(_ddata) deswegen dachte ich halt saxpy geht nicht wegen #1 Aber bei dir kommt der Fehler erst dann beim befreien des modules? Das passiert ja direkt nach dem die ProgramArgs gedownloaded wurden

LukasSiefke commented 5 years ago

1 und einen weiteren Error hatte ich ja behoben, deshalb können die Argument gedownloadet und gefreet werden.

Also das ist meine Ausgabe, wenn ich um das CUDA_SAFE_CALL(cuModuleUnload(_module))); ein try-catch Block mache:

LOGGER:[/tmp/tmp.gCqitQHoYR/src/Program.cpp:16]: Program uses 0 Headers.
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:11]: created ProgramArg with size: 0, which should not be uploaded and should not be downloaded
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:11]: created ProgramArg with size: 2048, which should be uploaded and should not be downloaded
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:11]: created ProgramArg with size: 2048, which should be uploaded and should not be downloaded
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:11]: created ProgramArg with size: 2048, which should be uploaded and should be downloaded
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:11]: created ProgramArg with size: 0, which should not be uploaded and should not be downloaded
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Program.cpp:26]: creating a kernel for function: saxpy
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:16]: created Kernel saxpy
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:94]: compiling Kernel
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:107]: with no template parameters
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:113]: Kernel compiled
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:132]: Kernel compiled
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:29]: configuring Kernel with grid: 32, 1, 1 and block 16, 1, 1
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:38]: launching Kernel
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:48]: uploading arguemnts
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:26]: NOT uploading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:19]: uploading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:22]: copying data to device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:19]: uploading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:22]: copying data to device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:19]: uploading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:26]: NOT uploading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:67]: launching saxpy<>
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:75]: done!
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:78]: downloading arguments
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:35]: NOT downloading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:42]: NOT freeing argument from device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:35]: NOT downloading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:39]: freeing argument from device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:35]: NOT downloading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:39]: freeing argument from device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:32]: downloading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:39]: freeing argument from device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:35]: NOT downloading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:42]: NOT freeing argument from device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:82]: freeing resources
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:84]: CUDAException geworfen Error: 201~CUDA_ERROR_INVALID_CONTEXT
-->description: 
    This most frequently indicates that there is no context bound to the current thread. This can also be returned if the context passed to an API call is not a valid handle (such as a context that has had cuCtxDestroy() invoked on it). This can also be returned if a user mixes different API versions (i.e. 3010 context with 3020 API calls). See cuCtxGetApiVersion() for more details.
->occoured in file:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:84]

LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:85]: freeing resources3

Process finished with exit code 255

Und folgendes passiert, wenn kein zusätzliches catch um das CUDA_SAFE_CALL steht:

LOGGER:[/tmp/tmp.gCqitQHoYR/src/Program.cpp:16]: Program uses 0 Headers.
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:11]: created ProgramArg with size: 0, which should not be uploaded and should not be downloaded
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:11]: created ProgramArg with size: 2048, which should be uploaded and should not be downloaded
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:11]: created ProgramArg with size: 2048, which should be uploaded and should not be downloaded
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:11]: created ProgramArg with size: 2048, which should be uploaded and should be downloaded
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:11]: created ProgramArg with size: 0, which should not be uploaded and should not be downloaded
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Program.cpp:26]: creating a kernel for function: saxpy
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:16]: created Kernel saxpy
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:94]: compiling Kernel
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:107]: with no template parameters
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:113]: Kernel compiled
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:132]: Kernel compiled
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:29]: configuring Kernel with grid: 32, 1, 1 and block 16, 1, 1
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:38]: launching Kernel
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:48]: uploading arguemnts
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:26]: NOT uploading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:19]: uploading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:22]: copying data to device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:19]: uploading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:22]: copying data to device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:19]: uploading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:26]: NOT uploading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:67]: launching saxpy<>
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:75]: done!
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:78]: downloading arguments
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:35]: NOT downloading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:42]: NOT freeing argument from device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:35]: NOT downloading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:39]: freeing argument from device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:35]: NOT downloading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:39]: freeing argument from device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:32]: downloading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:39]: freeing argument from device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:35]: NOT downloading argument
LOGGER:[/tmp/tmp.gCqitQHoYR/src/ProgramArg.cpp:42]: NOT freeing argument from device
LOGGER:[/tmp/tmp.gCqitQHoYR/src/Kernel.cpp:82]: freeing resources

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

Dieser try-catch in example_saxpy wird dabei nicht ausgelöst

...
try {
    ...
    program.kernel("saxpy")
        .compile()
        .configure(grid, block)
        .launch(program_args); // <---- CUDA_SAFE_CALL(cuModuleUnload(_module));
  } catch (const std::exception &e) {
    std::cerr << e.what() << std::endl;
  }
...
zeratax commented 5 years ago

oh lol @ ProgramArgs.download() und halt _copy da falsch zu initialisieren. Das mit dem try-catch macht mich aber gerade fertig, verstehe nicht wirklich warum man das jetzt extra catchen muss.

zeratax commented 4 years ago

fixed with https://github.com/ZerataX/cudacompiler/commit/b5066686b7e0478b5804a91480999ca685b398a3