用户
 找回密码
 立即注册
yuanwcj 该用户已被删除
发表于 2013-11-21 15:38:01
97672
CUFFT之后,需要将每一个cufftComplex数都乘以1/N,数据长度为51200*1024
我使用了下面2种方法,用event计时,发现计算时间都是6100ms左右,请问怎样优化,谢谢

方法1:
使用51200个block块,每个块1024个线程,每个线程处理1个数,如下
__global__ static void kernel1(cufftComplex *pSource,float Valpha)
{
        int threadID= threadIdx.x;
        int blockID=  blockIdx.x;
        int IndexThread=blockID*blockDim.x+threadID;

        cufftComplex tmp=*(pSource+IndexThread);
        (pSource+IndexThread)->x=(tmp.x*Valpha);
        (pSource+IndexThread)->y=(tmp.y*Valpha);
}

方法2:
使用512个block块,每个块1024个线程,每个线程处理100个数,如下
__global__ static void kernel2(cufftComplex *pSource,float Valpha)
{
        int threadID= threadIdx.x;
        int blockID=  blockIdx.x;
        int IndexThread=blockID*blockDim.x+threadID;

        cufftComplex tmp;        int i;
        for (i=0;i<100;i++)
        {
                tmp=*(pSource+IndexThread+i*1024*512);
                (pSource+IndexThread+i*1024*512)->x=(tmp.x*Valpha);
                (pSource+IndexThread+i*1024*512)->y=(tmp.y*Valpha);
        }

}

两种方法计算时间都差不多,不过6100多ms确实太吓人了,请问各位大侠该怎么优化谢谢
使用道具 举报 回复
发表于 2013-11-21 18:57:04
你确定是6100ms?

你在逗论坛玩么?

请您用profiler跑一下,上图! 以图为准!空口无凭!!

您知道6100ms是什么概念么? 那是6.1秒!!

请您严肃起来.这是一个严肃的讨论场合!

别的就不说了,请上证据.
使用道具 举报 回复 支持 反对
发表于 2013-11-21 18:58:32
LZ您好:

1:您两种写法访存效率是一样的,后者整体上可能略好一些。

2:根据您的数据规模计算,51200*1024*8=400MB,您声称消耗了6100ms,也就是6秒还多。这个计算是访存密集型的,按照您的数据,您的访存带宽才不到70MB/S,这和一般的GPU显存带宽至少相差3个数量级。

深刻怀疑您的计时结果有误。

请您使用visual profiler测试,并给出profiler的计时结果。

祝您好运~
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册