| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 762 人关注过本帖
标题:vc++中大数据运算问题
只看楼主 加入收藏
仰望星空的
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:50
专家分:248
注 册:2015-9-28
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
vc++中大数据运算问题
我想计算一个7000*7000大小、数据类型为double的矩阵A,定义了一个7*7大小的模版,然后对矩阵A做卷积运算,就是循环相乘,然后求加和,编译已经通过,可是,程序运行起来特别慢,如果是1000*1000大小的矩阵,大概10s运行结束,如果是7000*7000,不知道多久;算法方面个人觉得没啥可优化的,就是循环里面的乘积+求和;
请问各位大神,针对这样的大型矩阵,有什么可以提高运行效率的方法?
搜索更多相关主题的帖子: double 中大 
2015-11-12 14:43
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:20 
从“大概10s运行结束……不知道多久”上讲,7000*7000只比1000*1000大49倍,因此也只需要8分钟,但你说“不知道多久”,我只能怀疑你的代码有问题。
另从“大概10s运行结束”和“算法方面个人觉得没啥可优化的”上看,我建议你下载一个其它人已经写好的库。

我自己写了一个毫无优化的代码,试着运行了一下,7000*7000只需要7秒钟
如果我将数组溢出特别处理,速度还可以更快;
如果我使用滑窗优化,7*7可优化成2*7,又可以快3.5倍;
如果使用CUDA等优化,又可以再快几倍。
……
2015-11-12 16:07
仰望星空的
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:50
专家分:248
注 册:2015-9-28
收藏
得分:0 
可能我没等到8分钟吧,大神说的在理,受教;希望rjsp版主帮忙看下。
代码其实就是实现矩阵卷积(在循环中遍历相乘、求和,)
////////////为实现卷积计算,补齐数据,nmtf为卷积模版大小7*7,sample,line为图像行列7000*7000////////////
void MakeDataForCov(double *pInputData, double *pOutputData, int nmtf, int sample, int line)
{
    int ns = sample+nmtf-1;
    int nl = line+nmtf-1;
    int margin = (nmtf-1)/2;
    int i,j;

    for (i=0; i<line; i++)
        for (j=0; j<sample; j++)
            *(pOutputData+(margin+i)*ns+margin+j) = *(pInputData+i*sample+j);
    for (i=0; i<line; i++)//OutputData左右补齐
    {
        for (j=0; j<margin; j++)
        {
            *(pOutputData+(margin+i)*ns+j) = *(pInputData+i*sample+margin-j);
            *(pOutputData+(margin+i)*ns+margin+sample+j) = *(pInputData+i*sample+sample-2-j);
        }
    }
    for (i=0; i<margin; i++)//OutputData上下补齐
    {
        for (j=0; j<ns; j++)
        {
            *(pOutputData+(margin-1-i)*ns+j) = *(pOutputData+(i+margin)*ns+j);
            *(pOutputData+(margin+line+i)*ns+j) = *(pOutputData+(margin+line-1-i)*ns+j);
        }
    }   
}
///////////////////////////ImageConvol为计算图像卷积函数,pMakedata为上面补齐的输入图像,conv_template为卷积模版,大小为nPSFnum(7)*nPSFnum(7),conv_Image为输出/////
void ImageConvol(double *pMakedata,double *conv_template,int nPSFnum,double *conv_Image)
{
    int nSample=7000;int nLine=7000;
    for (int j=0;j<nSample;j++)
    {
        for (int k=0;k<nLine;k++)
        {
            float tmpData=0;
            for (int m=0;m<nPSFnum;m++)
            {
                for (int n=0; n<nPSFnum;n++)
                {
                    tmpData =tmpData+ *(pMakedata+(k+m)*(nSample+nPSFnum-1)+n+j) * *(conv_template+m*nPSFnum+n);
                }
            }
            *(conv_Image+k*nSample+j) = (float)tmpData;
        }
    }
}
2015-11-12 23:30
农民工
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:109
专家分:639
注 册:2015-8-22
收藏
得分:0 
建议把数据转成整数范围内来计算,这样多次浮点数运算,效率肯定很低的
2015-11-16 11:15
仰望星空的
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:50
专家分:248
注 册:2015-9-28
收藏
得分:0 
已经没有分了,不过还是谢谢楼上,之前写程序时候都是int类型,所以没那么明显,但后来又要求精度,所以一下子数据就於了;
我想优化一下计算卷积的方法,但也没成功,所以就贴出来,让大家看下有木有更好的解决办法~~
2015-11-18 09:32
快速回复:vc++中大数据运算问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014404 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved