我有以下一段代码,它扫描一个 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 毫秒。
有没有办法让这个简单的操作更快?
谢谢你们。
我认为你所要求的是不现实的。
您的整个数据结构约为 1GB。每秒扫描整个事物 15 次需要 15GB/s 的内存带宽。这是 DDR3 支持的高端,并且很好地进入了 DDR4 的中端领域。
此外,要实现在 1-2 毫秒内完成的既定目标,您需要在这段时间内读取那么多数据。您的计算机有 1TB/s 或 500GB/s 的内存总线吗?
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |