En jCuda on peut charger des fichiers cuda au format PTX ou CUBIN et appeler (lancer) __global__
fonctions (noyaux) de Java. En gardant cela à l'esprit, je veux développer un framework avec JCuda qui obtient la fonction __device__
de l'utilisateur dans un fichier .cu
lors de l'exécution, le charge et l'exécute. Et j'ai déjà mis en œuvre une fonction __global__
, dans lequel chaque thread trouve le point de départ de ses données connexes, effectuer un certain calcul, initialisation, puis appeler la fonction __device__
de l'utilisateur.Chargement de plusieurs modules dans JCuda ne fonctionne pas
Voici mon code pseudo-noyau:
extern "C" __device__ void userFunc(args);
extern "C" __global__ void kernel(){
// initialize
userFunc(args);
// rest of the kernel
}
et la fonction de l'utilisateur __device__
:
extern "C" __device__ void userFunc(args){
// do something
}
Et côté Java, voici la partie que je charge les modules (modules sont fabriqués à partir ptx
fichiers qui ont été créés avec succès à partir de fichiers cuda avec cette commande: nvcc -m64 -ptx path/to/cudaFile -o cudaFile.ptx
)
CUmodule kernelModule = new CUmodule(); // 1
CUmodule userFuncModule = new CUmodule(); // 2
cuModuleLoad(kernelModule, ptxKernelFileName); // 3
cuModuleLoad(userFuncModule, ptxUserFuncFileName); // 4
Lorsque j'essaie de l'exécuter j'ai eu une erreur à la ligne 3: CUDA_ERROR_NO_BINARY_FOR_GPU
. Après quelques recherches, j'obtiens que mon fichier ptx
a une erreur de syntaxe. Après l'exécution de cette commande a suggéré:
ptxas -arch=sm_30 kernel.ptx
Je suis:
ptxas fatal : Unresolved extern function 'userFunc'
Même quand je Substituer à la ligne 3 avec 4 pour charger userFunc avant noyau je reçois cette erreur. Je suis resté bloqué à cette phase. Est-ce la bonne façon de charger plusieurs modules qui doivent être reliés entre eux dans JCuda? Ou est-ce même possible?
Edit:
Deuxième partie de la question est here
C'était clair et complet. Je vous remercie. Je vais mettre en œuvre sa version JCUDA et l'afficher ici. – SonOfSun
Comme vous pouvez le voir, j'ai un peu comment développé la version JCuda de votre code. Mais il semble que j'ai quelques problèmes avec les paramètres de passage qui doivent être "passés par référence". Pouvez-vous jeter un coup d'oeil? – SonOfSun
@SonOfSun: Je ne peux pas vous dire pourquoi votre exemple JCUDA ne fonctionne pas parce que (a) il est incomplet et (b) je ne sais rien à propos de JCUDA. Je vous ai donné la séquence précise des appels d'API du pilote requis pour effectuer ce travail et un exemple complet que vous pouvez compiler et exécuter pour vous-même et confirmer que cela fonctionne. Je ne pense pas qu'il soit particulièrement sage de ne pas accepter une réponse juste parce que vous voulez de l'aide pour ce qui est effectivement une question différente de ce que vous avez demandé à l'origine. – talonmies