Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
openCL中的字符串扩展_C_Opencl - Fatal编程技术网

openCL中的字符串扩展

openCL中的字符串扩展,c,opencl,C,Opencl,我有一个简单的任务,就是根据以下规则展开字符串FX: X -> X+YF+ Y-> -FX-Y 在OpenCL中,不支持字符串操作,但不支持使用字符数组。并行扩展这个字符串的内核程序在openCL中会是什么样子 更多详细信息: 考虑下面的Python代码中“FX”的扩展。 axiom = "FX" def expand(s): switch = { "X": "X+YF+", "Y": "-FX-Y", } return sw

我有一个简单的任务,就是根据以下规则展开字符串
FX

X -> X+YF+
Y-> -FX-Y
在OpenCL中,不支持字符串操作,但不支持使用字符数组。并行扩展这个字符串的内核程序在openCL中会是什么样子

更多详细信息: 考虑下面的Python代码中“FX”的扩展。

axiom = "FX"
def expand(s):
    switch = {
        "X": "X+YF+",
        "Y": "-FX-Y",
    }
    return switch.get(s, s)


def expand_once(string):
    return [expand(c) for c in string]


def expand_n(s, n):
    for i in range(n):
        s = ''.join(expand_once(s))
    return s


expanded = expand_n(axiom, 200)
扩展的
结果将是公理“FX”扩展200次的结果。这是一个相当缓慢的过程,因此需要在openCL上进行并行化。
这个过程产生一个字符串数组,然后我将使用它来绘制一条龙曲线

下面是一个例子,我将如何想出这样一个龙曲线:这一部分不是很重要。OpenCL上的扩展是关键部分

 import turtles
    from PIL import Image
turtles.setposition(5000, 5000)
turtles.left(90)  # Go up to start.


for c in expanded:
    if c == "F":
        turtles.forward(10)
    elif c == "-":
        turtles.left(90)
    elif c == "+":
        turtles.right(90)

# Write out the image.
im = Image.fromarray(turtles.canvas)
im.save("dragon_curve.jpg")

像这样的递归算法并不特别适合GPU加速,尤其是当数据集在每次迭代中改变其大小时

如果确实需要以迭代方式执行此操作,那么挑战在于每个工作项都要知道在输出字符串中放置其结果的位置。实现这一点的一种方法是为工作组分配一个特定的输入子字符串,并且在每次迭代中,统计输出中每个工作组大小的子字符串中的X和Y的总数。由此,您可以计算在一次迭代中该子字符串将扩展多少,如果您累积这些值,您将知道每个子字符串扩展输出的偏移量。这是否有效是另一个问题。:-)

然而,您的算法实际上是相当可预测的:您可以精确地计算出初始字符串和迭代次数给定的最终字符串的大小。使用OpenCL生成此字符串的最佳方法是使用一个非递归函数,该函数在给定的M次迭代中解析计算位置N处的字符,然后在每个工作项中调用该函数一次,将字符串的(已知!)最终长度作为工作大小。我不知道是否有可能提出这样一个功能,但似乎有可能,如果有可能,这可能是在GPU上实现的最有效的方法

这似乎是可能的:据我所知,结果将是高度周期性的:

FX
FX+YF+
FX+YF++-FX-YF+
FX+YF++-FX-YF++-FX+YF+--FX-YF+
FX+YF++-FX-YF++-FX+YF+--FX-YF++-FX+YF++-FX-YF+--FX+YF+--FX-YF+
^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^^^
  A*      B       A       B       A       B       A       B
就我所见,那些A区和B区都是相同的。(除了第一个A,它实际上位于位置-1)因此,您可以完全确定地确定每16个位置中14个位置的字符。我强烈怀疑有可能找到连接它们的
+
s和
-
s模式。如果你明白了这一点,解决方案就会变得非常简单


请注意,当您使用该函数时,您可能甚至不需要将结果放入一个巨大的字符串中:您可以直接使用该函数为绘图算法提供数据。

问题并非100%清楚-您可能需要给出一些(稍微高级一点的)示例。您需要决定的一个重要方面是字符串的长度将如何随着转换而改变,以及这是如何可预测的。每个工作项都可能在某个子串上运行,因此您需要回答的最大问题是,每个工作项在结果中的哪个位置放置其结果?字符串操作的实际机制很简单-根据字符串编码,您需要处理单个字节或16位字等。我是无理想的。在这一点上,我想要一些可以合作的东西。例如,你的评论给了我一个暗示。欢迎在OpenCL上进行字符串扩展。请更好地解释您的问题,我们可以给您一些想法。目前,我不知道可能的输入和输出。也很高兴知道:你的字符串有多长?请看我上面的编辑是全部的200倍?这可能是一项太小的任务,不值得在gpu上执行。如果这在Python中很慢,你可以在C中使其接近即时。嘿,我提出了一个算法:有一个模式a+B和a-B。在这两者之间是+-或--。每个奇数位置取A+B,偶数位置取A-B,+-和-,取2的幂决定的模式。这只是一般的想法。我担心的是,在计算位置值时,我的算法需要以前计算的值。根据我对OpenCL的理解,传达先前计算的价值是昂贵的。有办法解决这个问题吗?这就是为什么我说不要让它成为一个迭代算法;分析出+/-模式,以便直接从位置生成它。在模式变得明显之前,您可能需要手工进行更多的扩展。我刚刚想出了如何进行扩展。我一直盯着它看。这很聪明。ThanksI被OpenCL字符串处理和操作卡住了,所以我发布了一个进一步的问题。请看你是否能在网站上给我一些见解