首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUDA: embedded for loop kernel

CUDA: embedded for loop kernel
EN

Stack Overflow用户
提问于 2011-01-23 06:11:10
回答 1查看 1.4K关注 0票数 5

我有一些代码,我想把它变成一个cuda内核。看吧:

代码语言:javascript
复制
    for (r = Y; r < Y + H; r+=2)
    {
        ch1RowSum = ch2RowSum = ch3RowSum = 0;
        for (c = X; c < X + W; c+=2)
        {
            chan1Value = //some calc'd value
                            chan3Value = //some calc'd value
            chan2Value = //some calc'd value
            ch2RowSum  += chan2Value;
            ch3RowSum  += chan3Value;
            ch1RowSum  += chan1Value;
        }
        ch1Mean += ch1RowSum / W;
        ch2Mean += ch2RowSum / W;
        ch3Mean += ch3RowSum / W;
    }

这应该被分成两个内核,一个用来计算RowSums,另一个用来计算平均值,我应该如何处理循环索引不是从零开始并以N结束的事实?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-23 07:22:03

假设您有一个计算这三个值的内核。配置中的每个线程将为每个(r,c)对计算三个值。

代码语言:javascript
复制
__global__ value_kernel(Y, H, X, W)
{
    r = blockIdx.x + Y;
    c = threadIdx.x + W;

    chan1value = ...
    chan2value = ...
    chan3value = ...
}

我不相信你可以在上面的内核中计算总和(至少是完全并行的)。你将不能像上面那样使用+=。如果你在每个块(行)中只有一个线程进行求和和平均,那么你可以把它放在一个内核中,就像这样……

代码语言:javascript
复制
__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;
    }
}

但是对于和数和均值,使用第一个值核,然后使用第二个核可能更好。可以进一步并行化下面的内核,如果它是独立的,那么当你准备好的时候,你可以专注于它。

代码语言:javascript
复制
__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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4770953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档