Re[26]: Жизнь внутри метода
От: Pavel Dvorkin Россия  
Дата: 06.11.08 11:41
Оценка:
Здравствуйте, 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.

Чудес на свете не бывает.
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.