将循环移至核函数内计算出错

  • 1 replies
  • 161 views
将循环移至核函数内计算出错
« 于: 十一月 18, 2022, 11:57:07 am »
以第一种方式进行循环时可以得到正确的计算结果,但是以第二种方式循环时计算出现错误,请问是什么原因导致计算错误?

Re: 将循环移至核函数内计算出错
« 回复 #1 于: 十二月 04, 2022, 11:53:14 am »
以第一种方式进行循环时可以得到正确的计算结果,但是以第二种方式循环时计算出现错误,请问是什么原因导致计算错误?
程序代码: [选择]

/*方式一*/
for (int i = 0; i < 100; i++)
{
kernel << < 100, 64 >> > (i,……);
}

void __global__ kernel(i, ……)
{
   ……
}



/*方式二*/

kernel << < 100, 64 >> > (……);

void __global__ kernel(……)
{
   

    for (int i = 0; i < 180; i++)
    {
        ……
    }
}


根据你的代码看,存在至少两种可能:
(1)前者每次kernel执行的时间较短,但启动了多次kernel。后者则只启动了1次kernel,但每次执行的时间较长。这种较长的kernel在Windows下,使用非TCC驱动的专业卡的情况下,容易引起执行超时而挂掉。

(2)两种代码并不等价,前者相对后者的每次循环,等于都在做一次"全局同步", 而后者做不到这点(你最多只能较为容易的做到block内部的线程同步,全局同步需要较为苛刻的条件,如果你真的需要这点,则反复启动kernel是最佳选择)。

(3)后者的i的范围比前者大了40%,可能会引起下标计算之类的范围问题(如果i参与了下标计算之类的式子的话)。