我正在學習在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]'。 –