【发布时间】: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