【发布时间】:2015-08-05 05:39:43
【问题描述】:
我有一个非常复杂的内核,我一直在优化。无需遍历所有代码,有一个内核可以将一些值写入全局内存。
然后第二个内核触发并对该数据进行数十亿次计算,所有这些都在本地内存中。我一遍又一遍地优化代码,将内核运行时间降低到大约 275 毫秒。
内核的最后一部分在本地内存中处理的数据数组上循环并搜索匹配的字符串。显然,如果它找到匹配项,则需要让主机程序知道这一点。我通过将 global_array[0].x 更改为 999 并将 global_array[0].y 更改为等于找到的结果来完成此操作。
内核完成后,它会读取 global_array 的第一个元素,检查是否 .x == 999,如果是,我们知道我们找到了目标。
在做更多优化的过程中,我发现如果我注释掉 global_array[0] = 行,内核运行速度是原来的 4 倍,大约为 62 毫秒。知道全局内存很慢,我开始测试各种东西。我想,嘿,也许如果我更改 LOCAL 数组,那么最后将 work_group_copy 复制回 global 我会得到一点速度提升。
但是不……我不知道。这真是令人困惑。如果在内核结束时,我将任何内容写入全局或本地内存中的任何位置,我的内核运行时间为 270 毫秒。如果我将相同的数据写入私有变量,或者只是执行其他不相关的代码,则为 62 毫秒。
我需要以某种方式从内核返回结果 - 但由于某种原因,写入局部变量,内核在到达终点之前执行 50 倍而不减速,似乎在写入时像疯了一样放慢速度结束。
谁能解释为什么会发生这种情况?我被难住了。
【问题讨论】:
-
你能发布你的内核代码吗?