有没有办法加速 C/C++ 中的嵌套 for 循环?

1 c++ performance for-loop

我有以下一段代码,它扫描一个 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;
                        }
                    }
                }
            }
Run Code Online (Sandbox Code Playgroud)

变量histMem是这样声明的:

unsigned int*** histMem;
Run Code Online (Sandbox Code Playgroud)

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

histMem = createArrayMem(64,64,65536);
Run Code Online (Sandbox Code Playgroud)

具体来说,这就是该函数的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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢你们。

Bot*_*tje 5

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

您的整个数据结构约为 1GB。每秒扫描整个事物 15 次需要 15GB/s 的内存带宽。这是 DDR3 支持的高端,并且很好地进入了 DDR4 的中端领域。

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