【问题标题】:How to minimize floating point operations in the below code如何在以下代码中最小化浮点运算
【发布时间】:2012-02-27 10:31:31
【问题描述】:

我需要在下面的代码中尽量减少失败的总数,任何人都可以快速浏览一下并告诉我应该在哪里努力吗? 我已经尝试了几个性能分析器,但结果无关紧要..

int twoDToOneD(int i, int j, int nRows)
{
return j*nRows + i;
}

double* addMatrices(int m, int n, double* A, double* B, bool add)
{
double* C = new double[m*n];
double* pA = A;
double* pB = B;
double* pC = C;

int i = m*n;

while(i--)
{
    if(add)
    {
        *pC = *pA + *pB;
    } else 
    {
        *pC = *pA - *pB;
    }

    pC++;
    pA++;
    pB++;
}

return C;
}

谢谢, 乔

【问题讨论】:

  • 有什么理由不能使用 SIMD?并且看到这都是基于矩阵的,它可能作为 GPGPU 内核表现最好
  • 是的,你可以在从vc6开始的任何版本中使用,更多的是你的目标平台是否支持SSE1/2/3/4

标签: c++ flops


【解决方案1】:

对,我没有读完最后一行,但看起来你很简单:

  1. 生成随机整数
  2. 将它们存储为doubles
  3. 添加它们
  4. 相加和相乘

IOW - 我看不到分数的任何用途,适当大小的整数会更好。如果这是真的,您可以删除程序中的每个 FLOP ;)

如果这不是一个准确的信号,您仍然可以在适当的范围内使用它,然后将信号放大,存储为整数,然后在某些情况下将结果降低到适当的范围。

对于适当大小的 mul/add,使用整数会更快,并且可能需要更少的内存——您也可以对它们应用 SIMD 指令。

除此之外 - 您改进缓存局部性、最小化分支和最小化动态分配也可以使程序快几倍。

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2023-03-19
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多