Параллелизм iOS - не достигать теоретического максимума

Я новичок в Grand Central Dispatch, и я провел несколько тестов, когда он выполнял некоторую обработку изображения. По сути, я запускаю алгоритм в градациях серого и последовательно, и использую GCD, и сравниваю результаты.

вот основной цикл:

UInt8 r,g,b;
uint pixelIndex;
for (uint y = 0; y < height; y++) {
    for (uint x = 0; x < width; x++) {
        pixelIndex = (uint)(y * width + x);

        if (pixelIndex+2 < width * height) {
            sourceDataPtr = &sourceData[pixelIndex];

            r = sourceDataPtr[0+0];
            g = sourceDataPtr[0+1];
            b = sourceDataPtr[0+2];

            int value = (r+g+b) / 3;
            if (value > MAX_COLOR_VALUE) {
                value = MAX_COLOR_VALUE;
            }

            targetData[pixelIndex] = value;
            self.imageData[pixelIndex] = value;
        }
    }
}

Он просто проходит и принимает среднее значение для красного, зеленого и синего и использует его для значения серого. Очень просто. Теперь параллельная версия basiclaly разбивает изображение на части и затем отдельно вычисляет эти части. А именно 2, 4, 8, 16 и 32 порции. Я использую базовый GCD, поэтому передаем каждую часть как отдельный блок для одновременной работы. Вот код в GCD:

dispatch_group_t myTasks = dispatch_group_create();

for (int startX = 0; startX < width; startX += width/self.numHorizontalSegments) {
    for (int startY = 0; startY < height; startY += height/self.numVerticalSegments) {
        // For each segment, enqueue a block of code to compute it.
        dispatch_group_async(myTasks, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
             // grayscale code...
        });
    }
}
dispatch_group_wait(myTasks, DISPATCH_TIME_FOREVER); 

Все работает нормально. Но что я не понимаю, так это ускорение / использование процессора. Запуск тестов в симуляторе (который использует мой двухъядерный процессор) я получаю:

~ 0.0945s время выполнения последовательно~ 0.0675с время выполнения с использованием GCD

Это ускорение примерно на 28% (то есть, на 72% больше, чем у последовательной версии). Теоретически, на 2-ядерном компьютере ускорение 100% является максимальным. Так что этого не хватает, и я не могу понять, почему.

Я наблюдаю за использованием процессора, и он достигает максимума около 118% - почему он не приближается к 200%? Если у кого-то есть идея относительно того, что я должен изменить, или в чем здесь виновник, я был бы очень признателен.

Мои теории:

Недостаточно работы с процессором (но изображение составляет ~ 3 150 000 пикселей)Не хватает времени, чтобы выстрелить до 200%? Может быть, каждому потоку требуется более длительное время выполнения, прежде чем он начнет жевать столько процессорного времени?Я подумал, что, возможно, накладные расходы были довольно высоки, но тест на запуск 32 пустых блоков в очередь (также в группе) занял около ~ 0,0005s максимум.

Ответы на вопрос(2)

Ваш ответ на вопрос