Предположим, у вас есть ядро, которое вычисляет три значения. Каждый поток в вашей конфигурации будет вычислять три значения для каждой пары (r, c).
__global__ value_kernel(Y, H, X, W)
{
r = blockIdx.x + Y;
c = threadIdx.x + W;
chan1value = ...
chan2value = ...
chan3value = ...
}
Я не верю, что вы можете рассчитать сумму (полностью параллельно, по крайней мере) в указанном выше ядре. Вы не сможете использовать + = как вы уже выше. Вы можете поместить все это в одном ядре, если у вас есть только один поток в каждом блоке (строке) сделать сумму и сказать, как это ...
__global__ both_kernel(Y, H, X, W)
{
r = blockIdx.x + Y;
c = threadIdx.x + W;
chan1value = ...
chan2value = ...
chan3value = ...
if(threadIdx.x == 0)
{
ch1RowSum = 0;
ch2RowSum = 0;
ch3RowSum = 0;
for(i=0; i<blockDim.x; i++)
{
ch1RowSum += chan1value;
ch2RowSum += chan2value;
ch3RowSum += chan3value;
}
ch1Mean = ch1RowSum/blockDim.x;
ch2Mean = ch2RowSum/blockDim.x;
ch3Mean = ch3RowSum/blockDim.x;
}
}
, но это, вероятно, лучше использовать первое ядро значения, а затем второе ядро как для сумм, так и для средств ... Возможно дальнейшее распараллеливание ядра ниже, и если оно будет отдельным, вы можете сосредоточиться на этом, когда будете готовы.
__global__ sum_kernel(Y,W)
{
r = blockIdx.x + Y;
ch1RowSum = 0;
ch2RowSum = 0;
ch3RowSum = 0;
for(i=0; i<W; i++)
{
ch1RowSum += chan1value;
ch2RowSum += chan2value;
ch3RowSum += chan3value;
}
ch1Mean = ch1RowSum/W;
ch2Mean = ch2RowSum/W;
ch3Mean = ch3RowSum/W;
}
попытайтесь выбрать один из вопросов, это затрудняет выбор правильного ответа. но, что касается вашего второго вопроса ... сложно ответить конкретно, но я думаю, вы увидите, как только вы углубитесь в развитие своего ядра. – jmilloy
вы должны запустить свое ядро с конфигурацией, такой как H-блоки и W-потоки на каждый блок. Затем вы вычисляете r и c из значений blockIdx и threadIdx внутри ядра. вычисляем r и c, но вы хотите ... я попытался поместить это в свой ответ ниже ... – jmilloy
Это выглядело как два вопроса, но я не был уверен, что контекст будет там, если я попытаюсь написать его как два вопроса: – Derek