我正在学习在python中使用opencl,我想优化一个函数。我了解到,这可以通过将全局内存存储在本地内存中来完成。然而,它不应该像它应该那样工作,持续时间是其两倍。这做得好吗?我可以更优化此代码吗?OpenCl简单不成功优化
__kernel void sumOP( __global float *input,
__global float *weights,
int layer_size,
__global float *partialSums,__local float* cache)
{
private const int i = get_global_id(0);
private const int in_layer_s = layer_size;
private const int item_id = get_local_id(0);
private const int group_id = get_group_id(0);
private const int group_count = get_num_groups(0);
const int localsize = get_local_size(0);
for (int x = 0; x < in_layer_s; x++)
{
cache[x] = weights[i*in_layer_s + x];
}
float total1 = 0;
for (int x = 0; x < in_layer_s; x++)
{
total1 += cache[x] *input[x];
}
partialSums[i] = sigmoid(total1);
}
Python的通话
l = opencl.LocalMemory(len(inputs))
event = program.sumOP(queue, output.shape, np.random.randn(6,).shape, inputs.data, weights.data,np.int32(len(inputs)),output.data,l)
感谢一些建议
使用本地内存进行优化的一般想法适用于工作组中的工作项都使用全局内存中的相似值的情况。您不必多次读取这些内容,而是将它们缓存在更快(但更小)的本地内存中,以便在工作组中重新使用。你的内核是否需要这个?如果是这样,你的内核的第一部分应该(并行)分担加载它们的负担,有障碍,然后做计算。最小限度地,你的代码缺少障碍。 – Dithermaster
同样,写入同一个“cache [x]”地址的组的所有工作项在竞态条件方面都不好。应该像'cache [i * k + x]'或者只是'cache [i]'。 –