for( i=0;i < regionCount;i++)
{
int sum=0;
for(cnt=0;cnt<i;cnt++)
sum+=GPUj1[cnt];
for(j=0;j<GPUj1[i];j++)
{
』
}
}
cuda程序大体结构(未优化)就是这样,自己优化完之后,在GPU跑的时间比在CPU跑的时间慢差不多一个数量级,不知道为什么~
for( i=0;i < regionCount;i++)
{
int sum=0;
for(cnt=0;cnt<i;cnt++)
sum+=GPUj1[cnt];
for(j=0;j<GPUj1[i];j++)
{
』
}
}
cuda程序大体结构(未优化)就是这样,自己优化完之后,在GPU跑的时间比在CPU跑的时间慢差不多一个数量级,不知道为什么~
第二个循环里基本都是赋值语句~
如果在kernel内部的该2重循环无可避免,我建议你仔细思考算法再说。
如果你只是不懂,不知道尝试将循环展开而写成这样(然后可能用<<<1,1>>>调用),那么我建议您将这个循环并行化。
从您的代码来说(指您发出的部分),您的代码可能可以被展开。
前一部分是对数组求和,后一部分是对一个数组赋值。最外层是对该步骤的重复(or 迭代?)。
我建议您可能可以尝试如下方式:第一部分改写成多个线程的并行求和(网上各种实现众多,可以参考)。后一部分改成并行赋值。而最外层可能可以考虑改为连续反复启动kernel.
这比你原来的在1个线程里的循环(不管是什么原因),效果要小。至少从访存上说,1个线程的这种,几乎完全没效率(读写均不能合并)。
建议请这样考虑下。
不知道楼主是否充分的考虑了多线程的并行?或许和2楼版主所说一样,你可能只用了1个线程来做了这个工作。。。当然希望楼主能够将你想要实现的问题叙述一下,不光是发一个代码这么简单,这样我们才能从算法方面进行考虑!