inclure les en-têtes de à OpenCL .cl fichier
J'ai écrit un OpenCL noyau dans une .cl
fichier. Il tente de #include
plusieurs en-têtes.
Sa compilation échoue, depuis le inclus fichiers d'en-tête sont "non trouvé".
Je suis conscient que clBuildProgram
peut prendre la -I dir
option, qui ajoute le répertoire dir
à la liste des répertoires à rechercher les fichiers d'en-tête.
Dans le khronus site forum ce post http://www.khronos.org/message_boards/viewtopic.php?f=37&t=2535 parle de la question.
Ils proposent d'utiliser clCreateProgramWithSource
qui spécifie toutes les sources (y compris .h fichiers).
J'ai une question concernant cette question:
- Quelle est la meilleure option? (
clBuildProgram
vsclCreateProgramWithSource
, comme décrit ci-dessus) - Si j'utilise
clCreateProgramWithSource
comment le compilateur de savoir quoi? Je veux dire, la source est synonyme de ce qui inclus de nom de fichier? - Si j'utilise
clBuildProgram
et il y a plusieurs répertoires à inclure des fichiers, comment dois-je préciser?
OriginalL'auteur Yakov | 2013-01-24
Vous devez vous connecter pour publier un commentaire.
OpenCL nécessite l'utilisation de la
clCreateProgramWithSource()
suivie parclBuildProgram()
.ClCreateProgramWithSource()
crée et retourne uncl_program
objet.Que
cl_program
objet est entrée enclBuildProgram()
.clBuildProgram()
vous permet de spécifier les options du compilateur, qui incluent le fichier à inclureles répertoires. Dans votre cas, pour le fichier d'en-tête comprend, il sera quelque chose comme la chaîne:
Le compilateur utilisé est le interne OpenCL compilateur dans le SDK OpenCL vous utilisez. Donc, si vous
utilisez AMD SDK, le AMD OpenCL compilateur qui fait partie de leur SDK OpenCL sera utilisé. De même pour Nvidia ou Intel.
Il est important de vérifier l'OpenCL code de statut pour TOUS les OpenCL appels de fonction.
Ceci est obligatoire pour les
clCreateProgramWithSource()
etclBuildProrgam()
pour obtenirtoutes les erreurs du compilateur ou de messages. Il y a tout un autre peu de code à écrire
pour obtenir la taille des messages et ensuite récupérer les messages eux-mêmes.
OriginalL'auteur Tim Child
La Nvidia OpenCL pilotes de périphériques ont un bug lors de l'utilisation -je avec un certain nombre de comprend et longueur de code. AMD et Intel n'ont pas ce problème. Mes solutions, au lieu de concaténer tous les .cl fichiers en un grand, lors de l'exécution. L'inconvénient de cette est que le débogage de code, le numéro de ligne de l'erreur correspond à la concatentated .cl fichier et non dans l'individu .cl fichiers.
Je doute que Nvidia va jamais résoudre ce problème. Ils ne se soucient pas de OpenCL beaucoup plus.
C'est intéressant. J'ai bien je l'ai testé sur le CPU. Je n'ai pas de AMD GPU donc je ne peux pas le tester sur le GPU. C'est peut-être un GPU vs CPU problème?
Non, je l'ai essayé sous les deux appareils sous Windows, le compilateur ne semble pas gérer par rapport chemins à inclure. En gros, j'ai "-je cl/" dans ma ligne de commande du compilateur, et mes grains sont disposées de manière régulière dans la cl/ répertoire, et bien que cela fonctionne bien sous Intel/Linux, AMD ne pas avoir tout ça, peu importe ce que je tente, et la seule solution que j'ai trouvé était soit coder en dur le chemin absolu de chacun .cl fichier dans les directives #include, ou ajouter ma cl/ dossier pour le système $PATH. Il pourrait être mon installation qui ne va pas bien, je ne conserve pas mon système Windows autant que mon Linux.
Eh bien dans ce cas pas de travail est meilleure que partiellement ou de manière aléatoire de travail. J'ai perdu beaucoup de temps à essayer de comprendre pourquoi mon code n'était pas en train de changer. Il serait continuer à utiliser l'ancien code et ne pas reconnaître mes chances. En fin de compte je pense que c'est mieux pour éviter l'option-I. Ajouter tous les .cl fichiers ensemble comme une seule grande pièce au moment de l'exécution. Une autre suggestion: j'ai toujours exécuter sur le PROCESSEUR d'abord avant de les tester sur le GPU. GPU bugs de collision, de tout mon système parfois (au moins sous Windows). Qui n'arrive jamais sur le CPU.
nVidia ne permet pas de chemins avec espaces. Essayez d'utiliser un vieux DOS le nom de chemin et il va fonctionner!
OriginalL'auteur
Il y a encore un sale tour: vous devriez imiter inclure vous-même (j'. e. quelque chose comme manuel de fusion). Il n'est pas très clair pour le codage, mais il fonctionne si votre OpenCL compilateur ne supporte pas (ou soutient à tort)
-I
directives. Cette approche n'est pas parfait (par exemple, vous perdez la coloration syntaxique), mais peut aider pour les vieux ou buggy OpenCL compilateurs.Petit exemple simple de cette possibilité:
OriginalL'auteur avtomaton