【问题标题】:Is there a way to speed up nested for loop in C/C++?有没有办法加快 C/C++ 中的嵌套 for 循环?
【发布时间】:2023-03-27 05:18:01
【问题描述】:

我有以下代码扫描 3-D 结构histMem,其中每个 64x64 元素包含一个表示直方图的 65536 个元素的数组。 目标是找到计数最高的直方图 bin 的位置。

            int maxVal, maxLoc;
            for (int r = 0; r < 64; r++) { //scan over 64 rows
                for (int c = 0; c < 64; c++) { //scan over 64 columns
                    maxVal = histMem[r][c][0];
                    maxLoc = 0;
                    for (int p = 0; p < nBins; p++) { //scan over 65536 histogram bins
                        if (histMem[r][c][p]> maxVal) { //update the max location and max value if needed
                            maxVal = histMem[r][c][p];
                            maxLoc = p;
                        }
                    }
                }
            }

变量histMem是这样声明的:

unsigned int*** histMem;

内存分配是使用以下函数完成的:

histMem = createArrayMem(64,64,65536);

具体来说,这是createArrayMem 函数所做的:

unsigned int*** createArrayMem(int hSize, int vSize, int depth) {

    unsigned int*** arrayMem = new unsigned int** [hSize];

    for (int i = 0; i < hSize; i++) {
        // Allocate memory blocks for rows of each 2D array
        arrayMem[i] = new unsigned int* [vSize];
        for (int j = 0; j < vSize; j++) {
            // Allocate memory blocks for columns of each 2D array
            arrayMem[i][j] = new unsigned int[depth];
        }
    }

    return arrayMem;
}

现在的问题是,为histMem 的每个 64x64 数组查找直方图峰值非常慢,完成任务大约需要 500 毫秒。

有没有办法让这个简单的操作更快?

谢谢大家。

【问题讨论】:

  • 是的。购买更好的计算机并在其上运行您的程序。
  • 64,64,65536 计数是否始终相同?会不会是带有unsigned int histMem[64][64][65536]; 的动态分配的单个变量? |您的代码在每个循环中重置 maxLoc = 0;。为什么会有那个变量呢?
  • 如果要在 64x64x65536 个值中找到最大值,则必须访问所有元素,无论它们如何排列,无论是 3d 还是平面 1d 数组
  • 一般建议:引入并行计算。 (OpenMP 易于使用)使用标准函数(如std::max)。
  • 谁在填充直方图?如果您对直方图使用自定义类型而不是裸数组,则可以在填充直方图时跟踪最大 bin

标签: c++ performance for-loop


【解决方案1】:

我认为你的要求是不现实的。

您的整个数据结构约为 1GB。每秒扫描整个事物 15 次需要 15GB/s 的内存带宽。这是 DDR3 支持的高端产品,而 DDR4 则属于中端产品。

此外,为了实现您在 1-2 毫秒内完成的既定目标,您需要在这段时间内读取这么多数据。您的计算机是否有 1TB/s 或 500GB/s 的内存总线?

【讨论】:

    【解决方案2】:

    也许你可以试试parallel_for

    【讨论】:

    • 你能提供对我的代码的适配吗?
    • 嵌套循环是那些需要时间尝试用 parallel_for (size_t(0), Size, [&](size_t i) 包围它们的循环
    猜你喜欢
    • 2020-09-14
    • 2018-06-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2021-04-19
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多