5 votes

intégration du code OpenCL dans l'exécutable

Il s'agit d'un suivi de Utilisation de #include pour charger le code OpenCL

J'ai remarqué que lorsque vous utilisez la méthode décrite par grrussel (et utilisée dans Bullet Physics), la chaîne de caractères créée est dépouillée de toutes les nouvelles lignes (les commentaires semblent également être dépouillés, mais je ne suis pas trop inquiet à ce sujet). En général, cela ne pose pas de problème si le code opencl inclus ne contient pas de définitions de préprocesseur, mais s'il en contient, le code ne pourra pas être compilé avec le compilateur OpenCL.

Y a-t-il un moyen d'obtenir le #include pour garder les nouvelles lignes, ou y a-t-il une meilleure méthode pour intégrer le code opencl dans mon exécutable (autre que de copier la chaîne dans un fichier cpp et de mettre des guillemets autour de tout) ?

J'ai testé cela dans Visual Studio 2010, je ne suis pas sûr que d'autres compilateurs présentent le même comportement. Je préférerais une méthode qui ne nécessite aucun outil externe et qui fonctionne avec une variété de compilateurs/plateformes.

Code copié d'une autre réponse :

En source C++ / C

#define MSTRINGIFY(A) #A
char* stringifiedSourceCL = 
#include "VectorAddKernels.cl"

Dans la source OpenCL

MSTRINGIFY(
   __kernel void VectorAdd(__global float8* c)
   {
    // snipped out OpenCL code...
    return;
   }
);

2voto

Macke Points 13474

J'écrirais un petit outil qui génère un cpp avec une chaîne constante à partir du fichier texte, que vous compileriez ensuite avec les autres éléments.

C'est ce que fait le compilateur de ressources moc de Qt (et plus encore, puisqu'il dispose de toute une API autour de lui), et il y a aussi l'option du kit de ressources de Windows (cf. cette réponse ci-dessous).

Quoi qu'il en soit, un petit outil de construction qui parcourt les fichiers d'un répertoire et construit un cpp à partir de ceux-ci devrait être suffisant, et quelque chose que vous pouvez mettre en place en 15 minutes (avec des compétences appropriées en matière de script).

Mise à jour : Conformément au commentaire d'Henry, sous Linux (ou avec Msys/Cygwin), vous pourriez utiliser xxd avec le -i (c'est-à-dire xxd -i ), qui lit un fichier et génère un fichier c-include avec le contenu exact défini correctement.

1voto

boiler96 Points 754

Excellente question !

Une chose qui fonctionne sous Windows est de traiter vos fichiers C OpenCL comme des ressources Windows. Le code source est alors intégré à votre exécutable. Dans votre fichier de ressources (.rc), vous devez ajouter quelque chose comme ceci :

IDR_OPENCL_FILE_1            OPENCL_SOURCE           "mydir\\myfile.cl"

Puis, dans la source de l'hôte, quelque chose comme ceci :

// Load the resource memory
HRSRC resource = FindResource(NULL, L"IDR_OPENCL_FILE_1", L"OPENCL_SOURCE");
HGLOBAL resMem = LoadResource(NULL, resource);
char* source = (char*)LockResource(resMem);
// Build a STL string out of it
DWORD resSize = SizeofResource(NULL, resource);
std::string cl_source = string(source, resSize);

Sous Linux, objcopy vous permettra de faire quelque chose de similaire. Vous pouvez construire un elf .o avec le fichier source exporté comme un symbole. Désolé, je n'ai pas d'extrait de code à portée de main pour cela pour le moment.

J'aimerais qu'il y ait une meilleure réponse indépendante de la plateforme. Si vous en trouvez une, faites-le moi savoir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X