2017-06-15 3 views
0

Je suis actuellement en train de distribuer un programme OpenCL (compilation en ligne).OpenCL build: avantage du code noyau de stringage

Maintenant, mon code de noyau est dans un fichier *.cl, qui est lu pendant la construction du noyau. Je pense que c'est aussi possible de convertir le code source du noyau en littéraux de chaîne, qui peut être lu directement au lieu du *.cl dans le même but.

Ma question est la suivante: quel serait l'avantage de filtrer le code du noyau?

+0

il pourrait y avoir des pièces comme '@ replace_me @' et on peut les remplacer par des valeurs dynamiquement modifiées et recompiler même code avec différents paramètres tels que la taille du tableau local (tableau local la taille doit être constante afin que vous puissiez recompiler chaque fois que vous avez besoin d'une taille différente pour les tableaux locaux). '__local float data [@replace_me _ @];' –

+0

Je vous recommande de mettre le code dans une chaîne dans le code. C'est beaucoup plus facile à utiliser qu'ouvrir un fichier. – DarkZeros

+0

@huseyintugrulbuyukisik: ne serait-il pas préférable d'utiliser le compilateur pour transférer ces primitives constantes ('-DSIZE = NUM')? –

Répondre

1

Avantages:

  • Pas besoin de traiter avec IO. Si vous devez supporter plusieurs systèmes de fichiers, cela peut être pénible (Windows, Linux, etc ...).
  • Plus facile pour l'utilisateur, l'exécutable est seulement 1 fichier.
  • Vous pouvez rencontrer des problèmes si quelqu'un modifie le fichier .cl.
  • Plus facile à compiler et à expédier.

Exemple:

const char *KernelSource = "\n" \ 
"__kernel void square(     \n" \ 
" __global float* input,     \n" \ 
" __global float* output,    \n" \ 
" const unsigned int count)    \n" \ 
"{           \n" \ 
" int i = get_global_id(0);    \n" \ 
" if(i < count)       \n" \ 
"  output[i] = input[i] * input[i]; \n" \ 
"}           \n"; 

program = clCreateProgramWithSource(context, 1, (const char **) &KernelSource, NULL, &err); 
+2

Un inconvénient est que si vous utilisez des chaînes, vous devez recompiler votre programme hôte chaque fois que vous changez la source de votre noyau. Si vous avez votre noyau sur le fichier, il peut être compilé indépendamment. – Ruyk