comment compiler opencl projet avec les noyaux
Je suis totalement débutant sur opencl, j'ai cherché sur internet et trouvé quelques "helloworld" démos pour opencl projet. Habituellement, dans une telle sorte de minimes de projet, il y a un *.cl fichier contient une sorte de opencl noyaux et un *.c fichier contient la fonction principale. Alors la question est comment puis-je compiler ce genre de projet est l'utilisation d'une ligne de commande. Je sais que je devrais utiliser une sorte de lOpenCL drapeau sur linux et cadre OpenCL sur mac. Mais je n'ai aucune idée de lier l' *.cl noyau de mon fichier source principal. Merci pour tous les commentaires ou liens utiles.
OriginalL'auteur wallen | 2014-10-22
Vous devez vous connecter pour publier un commentaire.
En OpenCL, le
.cl
des fichiers qui contiennent des périphériques du noyau codes sont généralement compilés et intégrés au moment de l'exécution. Cela signifie quelque part dans votre hôte OpenCL programme, vous devez compiler votre programme pour être en mesure de l'utiliser. Cette fonctionnalité permet à un maximum de portabilité.Prenons un exemple que j'ai recueillies à partir de deux livres. Ci-dessous est très simple OpenCL noyau de l'ajout de deux nombres de deux tableaux globaux et de les enregistrer dans un autre tableau global. J'ai enregistrer ce code dans un fichier nommé
vector_add_kernel.cl
.Ci-dessous est l'hôte du code écrit en C++, qui exploite OpenCL API C++. Je l'enregistrer dans un fichier nommé
ocl_vector_addition.cpp
à côté où j'ai enregistré mon.cl
fichier.Je compile ce code sur une machine avec Ubuntu 12.04 comme ceci:
Il produit un
ocl_vector_addition.o
, qui quand je le lance, affiche la sortie. Si vous regardez la compilation de commande, vous voyez, nous n'avons pas passé quelque chose au sujet de notre.cl
fichier. Nous avons seulement utilisé-lOpenCL
indicateur pour activer la prise en charge d'OpenCL bibliothèque pour notre programme. Aussi, ne vous laissez pas distraire par-std=c++11
de commande. Parce que j'ai utiliséstd::unique_ptr
dans le code hôte, j'ai eu à utiliser cet indicateur pour un succès de la compilation.Alors, où est-ce
.cl
fichier en cours d'utilisation? Si vous regardez le code hôte, vous trouverez quatre pièces que je répète dans numérotés ci-dessous:Dans la 1ère étape, on peut lire le contenu du fichier qui contient notre code de l'appareil et le mettre dans un
std::string
nommésourceCode
. Ensuite, nous faisons une paire de la chaîne et de sa longueur et de l'enregistrer sursource
qui a pour typecl::Program::Sources
. Après, nous avons préparé le code, nous faisons uncl::program
objet nomméprogram
pour lacontext
et charger le code source dans l'objet du programme. La 3ème étape est celle dans laquelle l'OpenCL code est compilé et lié) pour ladevice
. Depuis le code de l'appareil est construit dans la 3e étape, nous pouvons créer un objet de noyau nommévecadd_kernel
et associer le noyau nommévecadd
à l'intérieur avec notrecl::kernel
objet. C'était à peu près l'ensemble des étapes de la compilation d'un.cl
fichier dans un programme.Le programme que j'ai montré et expliqué au sujet crée le dispositif de programme à partir du code source du noyau. Une autre option est d'utiliser les binaires à la place. À l'aide de binaires programme vous permet d'application temps de chargement et permet une distribution binaire du programme, mais les limites de la portabilité depuis binaires qui fonctionnent très bien sur un seul appareil peut ne pas fonctionner sur un autre appareil. La création de programme à l'aide du code source et les binaires sont également appelés en ligne et hors ligne de compilation respectivement (plus d'informations ici). Je saute ici puisque la réponse est déjà trop long.
OriginalL'auteur Farzad
Ma réponse est quatre ans de retard. Néanmoins, j'ai quelque chose à ajouter qui complète @Farzad réponse, comme suit.
Point de prêter à confusion, en OpenCL pratique, le verbe pour compiler est utilisé pour désigner deux, choses incompatibles:
L'on arrive au moment de la construction. L'autre se produit au moment de l'exécution.
Il aurait été moins compliqué a deux verbes différents été mis en place, mais ce n'est pas comment la terminologie a évolué. Classiquement, le verbe pour compiler est utilisé pour les deux.
Si vous ne savez pas, alors essayez cette expérience: renommer votre *.cl fichier, de sorte que vos autres fichiers source ne peut pas le trouver, puis de construire.
Voir? Il s'appuie fine, n'est-ce pas?
C'est parce que l' *.cl fichier n'est pas consulté au moment de la construction. Seulement plus tard, lorsque vous essayez d'exécuter le fichier binaire exécutable, le programme échoue.
Si cela peut aider, vous pouvez penser à l' *.cl fichier comme s'il s'agissait d'un fichier de données ou un fichier de configuration ou même un script. Il n'est pas littéralement un fichier de données, un fichier de configuration ou un script, peut-être, pour qu'il ne finalement compilé à une sorte de code machine, mais la machine code est code GPU et il n'est pas fait à partir de la *.programme cl de texte jusqu'au moment de l'exécution. En outre, au moment de l'exécution, votre compilateur C en tant que telle n'est pas engagée. Plutôt, il est de votre OpenCL bibliothèque qui possède le bâtiment.
Il m'a fallu un temps assez long pour redresser ces concepts dans mon esprit, surtout parce que—comme vous—j'ai longtemps été familier avec les étapes de la C/C++ cycle de production; et, par conséquent, je pensais que je savais ce que des mots comme pour compiler signifiait. Une fois que votre esprit a les mots et les concepts de droit, les différents OpenCL documentation commence à prendre du sens, et vous pouvez commencer à travailler.
OriginalL'auteur thb