Здравствуйте, gandjustas, Вы писали:
У меня кот есть. Он очень любит, когда его по шерсти гладят, и очень не любит, когда против шерсти или даже поперек шерсти
G> for (int x = pChunk->xStart; x <= xEnd; x++)
G> {
G> unsigned s = 0;
G> for ( int y = 0; y < nHeight; y++)
G> {
G> s += matrix[x + y * matrixWidth];//!
G> }
G> columnSum[x] = s;
G> }
Я-то в оригинальном своем примере GetPixel суммировал, там все равно, как суммировать, время, на GetPixel требуемое, все перекроет. А ты за память взялся. И расположил ты эту матрицу по строкам, как все сейчас делают. А вот доступ к ней оставил по столбцам, что в таком случае лучше не делать. Оптимзатору компилятора это нравится не более, чем моему коту, да и доступ к памяти тут тоже не ахти.
Заменим этот код на
for (int x = pChunk->xStart; x <= xEnd; x++)
columnSum[x] = 0;
for ( int y = 0; y < nHeight; y++)
for (int x = pChunk->xStart; x <= xEnd; x++)
columnSum[x] += matrix[x + y * matrixWidth];//!
ну и для непараллельного алгоритма тоже.
Кроме того, сравнивать значения, полученные по GetTickCount, при столь малых величинах, не очень корректно. У нее точность порядка 15 мсек, так что 60 и 70 — это одно и то же в пределах ошибки. Поэтому я увеличил
const int matrixWidth = 12800;
При этом.
С++, Release, VS 2005
по столбцам (твой то есть)
359 344
по строкам (мой)
16 15
Замечу в скобках, что и умножение в цикле там ни к чему, так как y * matrixWidth не меняется во внутреннем цикле, но не стал переделывать, компилятор разберется и сам.
В общем, ты выбрал наихудший способ из всех возможных

.
G>На C# c Paralle Extension June CTP
Paralle Extension June CTP у меня нет, так что оставил только непараллельный алгоритм. Для него на моей машине 450.
Чудес на свете не бывает.