J'ai dit en this question que j'avais un problème de chargement des modules ptx dans JCuda et après l'idée de @ talonmies, j'ai implémenté une version JCuda de sa solution pour charger plusieurs fichiers ptx et les charger comme module unique. Voici la partie correspondante du code:JIT dans JCuda, chargement de plusieurs modules ptx
import static jcuda.driver.JCudaDriver.cuLinkAddFile;
import static jcuda.driver.JCudaDriver.cuLinkComplete;
import static jcuda.driver.JCudaDriver.cuLinkCreate;
import static jcuda.driver.JCudaDriver.cuLinkDestroy;
import static jcuda.driver.JCudaDriver.cuModuleGetFunction;
import static jcuda.driver.JCudaDriver.cuModuleLoadData;
import jcuda.driver.CUjitInputType;
import jcuda.driver.JITOptions;
import jcuda.driver.CUlinkState;
import jcuda.driver.CUfunction;
public class JCudaTestJIT{
private CUmodule module;
private CUfunction functionKernel;
public void prepareModule(){
String ptxFileName4 = "file4.ptx";
String ptxFileName3 = "file3.ptx";
String ptxFileName2 = "file2.ptx";
String ptxFileName1 = "file1.ptx";
CUlinkState linkState = new CUlinkState();
JITOptions jitOptions = new JITOptions();
cuLinkCreate(jitOptions, linkState);
cuLinkAddFile(linkState, CUjitInputType.CU_JIT_INPUT_PTX, ptxFileName4, jitOptions);
cuLinkAddFile(linkState, CUjitInputType.CU_JIT_INPUT_PTX, ptxFileName3, jitOptions);
cuLinkAddFile(linkState, CUjitInputType.CU_JIT_INPUT_PTX, ptxFileName2, jitOptions);
cuLinkAddFile(linkState, CUjitInputType.CU_JIT_INPUT_PTX, ptxFileName1, jitOptions);
long sizeOut = 32768;
byte[] image = new byte[32768];
Pointer cubinOut = Pointer.to(image);
cuLinkComplete(linkState, cubinOut, (new long[]{sizeOut}));
module = new CUmodule();
// Load the module from the image buffer
cuModuleLoadData(module, cubinOut.getByteBuffer(0, 32768).array());
cuLinkDestroy(linkState);
functionKernel = new CUfunction();
cuModuleGetFunction(functionKernel, module, "kernel");
}
// Other methods
}
Mais j'ai eu l'erreur de CUDA_ERROR_INVALID_IMAGE
à appeler la méthode cuModuleLoadData
. Pendant le débogage, j'ai vu qu'après avoir appelé la méthode cuLinkComplete
et que j'ai passé le tableau image comme sortie, le tableau est toujours inchangé et clair. Est-ce que je passe le paramètre de sortie correctement? Est-ce ainsi que l'on peut passer une variable par référence dans JCuda?
Vos fichiers d'entrée ont des extensions '.cu'. Si elles sont source CUDA C, elles ne peuvent pas être compilées JIT ou liées. Seul le code PTX ou les objets binaires précompilés peuvent être liés au moment de l'exécution par le pilote. – talonmies
@talonmies: Oui, ils sont du code PTX. C'était une faute de frappe dans la question. – SonOfSun