Доступ к памяти чрезвычайно медленный для простой петли через массив - PullRequest
0 голосов
/ 26 июля 2011

У меня примерно в 50 раз больше времени, чем ожидалось, чтобы выполнить простое задание. Моей первой реакцией было то, что я нарушил доступ к памяти в массивах, что привело к отсутствию кэша. Однако это не так.

Назначение значения пикселя и обновление массивов принимает возраст собаки. У кого-нибудь из вас есть склонность к тому, почему это происходит? (Я собираю для iPod с A4)

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;              
    }
}

1 Ответ

0 голосов
/ 26 июля 2011

Результат _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;              
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...