【问题标题】:Memory Access Exceedingly Slow For a Simple Loop Through an Array通过数组的简单循环的内存访问非常慢
【发布时间】:2011-07-25 22:11:54
【问题描述】:

循环一个简单的作业所用的时间大约是预期的 50 倍。我的第一反应是我扰乱了数组中的内存访问,导致缓存未命中。然而,情况似乎并非如此。

像素值分配和更新数组需要狗的年龄。你们中的任何人都倾向于为什么会发生这种情况吗? (我正在为带有 A4 的 iPod 编译)

memset(columnSumsCurrentFrameA, 0, sizeof(unsigned int) * (_validImageWidth/numSubdivisions) );
memset(rowSumsCurrentFrameA, 0, sizeof(unsigned int) * (_validImageHeight/numSubdivisions) );

int pixelValue = 0;
int startingRow = 0;
int startingColumn = 0;

for (int i = 0; i < _validImageHeight/numSubdivisions; i++)
{
    int index = (i + startingRow) * _imageWidth;
    for( int j = 0; j < (_validImageWidth/numSubdivisions); j++)
    {
        pixelValue = imageData[index + startingColumn + j];
        columnSumsCurrentFrameA[j] += pixelValue;           
        rowSumsCurrentFrameA[i] += pixelValue;              
    }
}

【问题讨论】:

  • 你怎么知道它花费的时间是你预期的 50 倍?您的列表中没有计时码。如果你尝试显示位图,那比像素写入要慢得多。
  • 非常感谢您的帮助!至于我的问题,我发现我认为是问题所在。虽然我的像素值看起来好像它们存在于主系统内存中,但我怀疑这些值存储在专用于 GPU 的内存部分中。所以,我有效地从 GPU 请求数据;高延迟操作。我通过对以前内存空间中的所有数据执行单个 memcpy 到我自己 malloc 的部分来减轻影响。这使我的表现翻了一番。由于 Apple 在此类问题上是一本封闭的书,我无法确定,但我相当确定这就是问题所在。
  • hotpaw2,您说得对,先生!我应该张贴计时措施。我所说的比预期慢 50 倍是基于我重用了另一位提出基准测试的开发人员的一些代码。这些基准并不完全准确,实际上我的速度降低了 3 倍。我的解决方案见上文。再次感谢各位!

标签: iphone objective-c arrays performance


【解决方案1】:

_validImageWidth/numSubdivisions 的结果必须是整数,你确定总是这样吗?

另外,你应该在进入双循环之前计算_validImageWidth/numSubdivisions,假设你的编译器会处理它是不安全的。

int limit = _validImageHeight/numSubdivisions;

for (int i = 0; i < limit; i++)
{
        int index = (i + startingRow) * _imageWidth;
        for( int j = 0; j < limit; j++)
        {
            pixelValue = imageData[index + startingColumn + j];
            columnSumsCurrentFrameA[j] += pixelValue;           
            rowSumsCurrentFrameA[i] += pixelValue;              
        }
}

【讨论】:

    猜你喜欢
    • 2015-09-01
    • 2021-05-29
    • 2015-06-27
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2022-01-22
    • 2012-09-20
    • 2018-11-18
    相关资源
    最近更新 更多