2011-10-01 1 views
14

J'ai travaillé avec OpenCL sur quelques projets, mais j'ai toujours écrit le noyau comme une fonction (parfois assez grande). Maintenant, je travaille sur un projet plus complexe et j'aimerais partager des fonctions sur plusieurs noyaux. Mais les exemples que je peux trouver tous montrent le noyau comme un seul fichier (très peu appellent même des fonctions secondaires). Il semble qu'il devrait être possible d'utiliser plusieurs fichiers - clCreateProgramWithSource() accepte plusieurs chaînes (et les combine, je suppose) - bien que Program() de pyopencl ne prenne qu'une seule source.Comment structurer les grands noyaux OpenCL?

Je voudrais entendre parler de quelqu'un avec l'expérience de faire ceci:

  • Y a-t-il des problèmes associés aux fichiers sources multiples?
  • Est-ce que la meilleure solution pour pyopencl consiste simplement à concaténer des fichiers?
  • Existe-t-il un moyen de compiler une bibliothèque de fonctions (au lieu de passer dans la source de la bibliothèque avec chaque noyau, même si tous ne sont pas utilisés)?
  • S'il est nécessaire de transmettre la source de la bibliothèque à chaque fois, les fonctions inutilisées sont-elles supprimées (pas de surcharge)?
  • Autres bonnes pratiques/suggestions?

Merci.

+2

Vous pouvez créer un fichier de concaténation aveC#include "part1.cl" #include "part2.cl". Cela fonctionne pour moi (compilateur NVidia), bien que probablement tout est compilé chaque fois que l'application fonctionne. Je pense qu'avoir une bibliothèque de fonctions précompilées est un peu de science fiction, car le code de fonction est incorporé dans chaque noyau (c'est pourquoi vous ne pouvez pas écrire de fonctions récursives). –

Répondre

6

Je ne pense pas que OpenCL ait un concept de plusieurs fichiers sources dans un programme - un programme est une unité de compilation. Vous pouvez toutefois utiliser #include et insérer des en-têtes ou d'autres fichiers .cl lors de la compilation.

Vous pouvez avoir plusieurs noyaux dans un programme OpenCL - ainsi, après une compilation, vous pouvez appeler n'importe lequel des noyaux compilés.

Tout code non utilisé - les fonctions ou tout ce qui est statiquement inaccessible - peut être considéré comme éliminé lors de la compilation, à un coût minime pour la compilation.

+0

merci. c'est ce que je fais. mais, de manière frustrante, pyopencl ne prend pas en compte le contenu #include lors de la mise en cache des noyaux. donc changer les fichiers "library" n'affecte pas les noyaux compilés sans supprimer manuellement le cache. de toute façon, je vais attendre pour voir si quelqu'un a une meilleure idée avant de vous marquer comme meilleur (et seulement!). à votre santé. –

+0

Si c'est vrai, alors la syntaxe de clCreateProgramWithSource est assez gênante, n'est-ce pas? Il requiert explicitement plusieurs chaînes et la longueur de chacune de ces chaînes. Je ne suis pas sûr que cela fonctionne réellement (je suis arrivé ici en essayant de le faire fonctionner) mais il semble étrange qu'il ne peut pas fonctionner étant donné la syntaxe ... – user1111929

5

Dans OpenCL 1.2, vous liez ensemble différents fichiers objets.

+0

merci; J'essaierai cela quand je reviendrai au travail topclic. –

Questions connexes