GPU高性能计算CUDA编程:Vflip()和MTFlipV()的比较

GPU高性能计算CUDA编程:Vflip()和MTFlipV()的比较

声明:本文不做商用

Vflip()核函数中的代码与代码2.7中该函数的CPU版本,即MTFlipV()的相应步骤类似。MTFIipV()函数也有这三个步骤,但每个步骤的代码都不相同,如下所示:
1.我是谁?确定线程ID对于CPU线程来说并不是什么大事,只需要一行代码,如下所示。因为线程ID(tid)不是由硬件生成的,相反,它来自main()中使用的for循环,如下所示:

for(i=0;i < NumThreads; i++){
    ThParam[i] = i;
    ThErr = pthread_create(&ThHandle[i], &ThAttr, MTFlipFunc, (void *)&ThParam[i]);
    if(ThErr != 0){
        ...
        exit(EXIT_FAILURE);
    }
}

&ThHandle[i]在线程函数中被替换为tid,如下所示:

void *MTFlipV(void* tid)
{
    long ts = *((int *)tid);  //在这儿存放我的线程ID
}

2.我的任务是什么?确定起始和终止索引对于CPU代码来说也非常容易。参见【0voice C++】它只是用一个更好的公式来计算该线程负责的图像部分,如下所示:

ts *= ip.Hbytes/ NumThreads;                // 起始索引
long te = ts + ip.Hbytes / NumThreads - 1;  // 终止索引

3.执行……但是,执行部分的代码要长很多,如下所示:

for(col = ts; col <= te; col += 3){
    row = 0;
    while(row<ip.Vpixels/2){
        pix.B= TheImage[row][col];
        ...
        TheImage[ip.Vpixels-(row+1)][col+2] = pix.R;
        row++;
    }
}
pthread exit(NULL);

让我们来比较Vflip()和MTFipV():
口当对两者进行比较时,会发现它们的工作有较大的变化。这没有什么令人吃惊的。在CPU的情况下,我们谈论的是8至16个线程,而在GPU的情况下,我们谈论的是数千万个线程。当你有这么多的线程,并且维度尺寸也有所增加时,索引的计算当然会变得复杂。
口在GPU中,花费在确定线程ID(步骤1)和确定完成工作所需的各索引值(步骤2)上的时间占据了实际执行工作所需时间(步骤3)的大部分。
口在CPU中,前两个步骤所需的时间是微不足道的,实际工作时间占据了整个执行时间的大部分。因为当你有数千万个线程时,“线程索引管理”最终会花费很多时间。

口在GPU代码中我们看不到for循环,而CPU代码需要两个嵌套的for循环。

因此,总结一下,尽管管理线程索引最终成为GPU代码中的一项任务,但我们可以免费获得硬件管理的索引,从而可以减轻大部分的负担。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值