鉴于OpenCL字符串' FX'根据以下规则进行扩展:
X -> X+YF+
Y-> -FX-Y
我在C中有以下程序:
#define NTIMES 2
#define MAXC 100
#define SDEF "FX" /* string (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;
}
例如:经过两次FX
扩展后,我应该得到:FX+YF++-FX-YF+
。输入可以作为FX
给出,但由于它已经知道,因此不必给出。它可以存储在内核程序中的某个位置。输出应该是扩展字符串。
我应该如何将此程序转换为OpenCL内核程序以使其高效运行?这是关于访问OpenCL上的全局,本地和私有内存。
这是一个如何运行该程序的示例:
char str[MAXC] = "";
expandntimes (str, NTIMES);
str
尺寸和NTIMES
限制了可能的展开次数。我认为这些将成为OpenCL内核程序的一些参数。如何通过内核程序处理字符串扩展以避免过度使用慢速全局内存?