Malloc in Kernel

Ik probeer een code te compileren die een malloc-functie in de kernel heeft en ik krijg deze foutmelding:

Error   5   error : calling a host function("malloc") from a __device__/__global__ function("bitapS") is not allowed    C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\src\str_bit\main.cu    36  1   str_bit

Mijn opdrachtregel is:

Error   6   error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" -gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-version 2010 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64" -I"../../common/inc" -I"../../../shared/inc" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include"  -G0  --keep-dir "x64\Debug" -maxrregcount=0  --machine 64 --compile  -D_NEXUS_DEBUG -g    -Xcompiler "/EHsc /nologo /Od /Zi  /MTd " -o "x64/Debug/main.cu.obj" "C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\src\str_bit\main.cu"" exited with code 2.   C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\CUDA 4.0.targets  357 10  str_bit

Suggesties? Ik dacht dat je met sm_20 ingeschakeld kon toewijzen ... mijn kaart is een 460 GTX Bedankt!

1
Met -gencode compileert nvcc de code voor alle van de bijgeleverde architecturen en wordt een 'vetbinair getal' gemaakt. Dus de fout treedt op wanneer het de code compileert die malloc bevat voor sm_10 .
toegevoegd de auteur Jared Hoberock, de bron
Ik zie het potentiële probleem met -gencode = arch = compute_10, code = \ "sm_10, compute_10 \" verklaring, weet je zeker dat het geen voorrang heeft?
toegevoegd de auteur Erbureth, de bron

3 antwoord

Je zou geen geheugen moeten toewijzen in de kernel. Ooit. Dit is een duidelijk teken dat je CUDA kernel slecht is ontworpen en slechte prestaties zal hebben.

3
toegevoegd
Heeft een +1 gegeven. Toewijzing binnen een CUDA-kernel is nooit een goed idee ...
toegevoegd de auteur anonymous coward, de bron
jij kan! Lees de specificaties! Je moet sm_20, compute_20 ook aan je bestand toevoegen! Toch bedankt!
toegevoegd de auteur Yannis Assael, de bron
@iassael: onit is zowel correct als incorrect: hij heeft niet gelijk als hij zegt dat je het geheugen niet dynamisch binnen kernels kunt toewijzen tijdens runtime op apparaten met rekencapaciteit 2.0; hij heeft gelijk als hij zegt dat je het echt, echt, echt niet zou moeten doen als je om prestaties geeft, wat een redelijke veronderstelling lijkt gezien het feit dat je in de eerste plaats CUDA en GPU's gebruikt.
toegevoegd de auteur Patrick87, de bron
@iassael Misschien kan dat, maar ik wed dat het qua prestaties een slecht idee is. Omdat al je inputs naar de kernel sowieso van de host moeten komen (of statisch zijn), kun je al je berekeningen doen aan de hostkant om de juiste hoeveelheid geheugen toe te wijzen.
toegevoegd de auteur onit, de bron
Bewerkt mijn bericht. Toestaan ​​dat dit een relatief nieuwe functie moet zijn waarvan ik me niet bewust was. Ik sta nog steeds achter mijn opmerking dat je dit waarschijnlijk niet zou moeten doen.
toegevoegd de auteur onit, de bron

Het is waar dat je het niet zou moeten doen, maar als ze het hebben ingeschakeld, heeft het waarschijnlijk een aantal toepassingen. De code geeft een foutmelding omdat u compileert voor architectuur 1.0 en 2.0. Om het te compileren, kun je verwijderen

-gencode=arch=compute_10,code=\"sm_10,compute_10\"

vanaf de opdrachtregel als u alleen van plan bent om de code op fermi-apparaten uit te voeren of als u een alternatieve code in uw broncode voor oudere apparaten wilt opgeven. U kunt dit doen met behulp van de NVCC preprocessor-macro:

__CUDA_ARCH__

zoals dit:

#if (__CUDA_ARCH__ < 200)
/* code for 1.x arch */
#else
/* code for 2.x arch */
#endif

Het lijkt erop dat u Visual Studio gebruikt, dus in de projecteigenschappen kunt u naar de cuda-sectie gaan en daar de architecturen specificeren waarvoor u niet wilt bouwen.

3
toegevoegd

Ik heb het gevonden.... Je moet specificeren sm_20, compute_20 ook naar uw bestandseigenschappen, niet alleen in de projectattributen!

Toch bedankt!

1
toegevoegd