优化OpenCL程序

时间:2018-06-05 22:07:30

标签: c opencl pyopencl

鉴于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内核程序的一些参数。如何通过内核程序处理字符串扩展以避免过度使用慢速全局内存?

0 个答案:

没有答案