Optimisation des programmes OpenCL

Étant donné une chaîne OpenCL ‘FX’ à développer selon les règles suivantes:

X -> X+YF+ Y-> -FX-Y 

J’ai le programme suivant en C:

 #define NTIMES 2 #define MAXC 100 #define SDEF "FX" /* ssortingng (default) */ #define XEXP "X+YF+" /* X expansion */ #define YEXP "-FX-Y" /* Y expansion */ /* returns pointer to 1-past last expansion on success, NULL otherwise */ char *expandonce (char *s) { char *p = s, *expanded = NULL; size_t lxexp = strlen (XEXP), lyexp = strlen (YEXP); while (*p) { if (*p == 'X') { /* handle 'X' found */ size_t lens = strlen (s); /* get new length of s */ if (MAXC > lens + lxexp) { /* room to expand? */ size_t lenp = strlen (p); /* total to shift */ /* shift chars to right of 'X' by lxexp-1 including '\0' */ memmove (p + lxexp, p + 1, lenp + lxexp - 1); memcpy (p, XEXP, lxexp); /* copy expansion */ p += lxexp; /* add offset */ expanded = p; /* set return */ } } else if (*p == 'Y') { /* handle 'Y' found */ size_t lens = strlen (s); /* same for 'Y' */ if (MAXC > lens + lyexp) { size_t lenp = strlen (p); memmove (p + lyexp, p + 1, lenp + lyexp - 1); memcpy (p, YEXP, lyexp); p += lyexp; expanded = p; } } else /* handle all other chars */ p++; } return expanded; } /* returns number of successful expansion loops */ int expandntimes (char *s, int n) { int i = 0; char *p = s; for (i = 0; i < n; i++) if ((p = expandonce (s)) == NULL) break; return i; } 

Par exemple: après deux extensions de FX je devrais obtenir: FX+YF++-FX-YF+ . L’entrée peut être donnée en tant que FX mais comme elle est déjà connue, elle n’a pas à être donnée. Il peut être stocké quelque part dans le programme du kernel. La sortie devrait être la chaîne développée. Comment devrais-je convertir ce programme en un programme kernel OpenCL pour le rendre efficace? Cela concerne l’access à la mémoire globale, locale et privée sur OpenCL. Voici un exemple de la façon dont on peut exécuter ce programme:

 char str[MAXC] = ""; expandntimes (str, NTIMES); 

La taille de str et NTIMES limitent le nombre d’expansions possibles. Je pense que ce seront quelques-uns des arguments fournis au programme kernel OpenCL. Comment le programme du kernel doit-il gérer le développement des chaînes pour éviter une utilisation excessive de la mémoire globale lente?