Я выполняю вычисление трафарета на матрице, которую я ранее прочитал из файла.Я использую два разных вида матриц (тип NonZero и тип Zero).Оба типа имеют общее значение границ (обычно 1000), тогда как остальные элементы равны 0 для нулевого типа и 1 для ненулевого типа.
Код хранит матрицу файла в двух выделенных матрицахтот же размер.Затем он выполняет операцию в каждом элементе одной матрицы, используя свое собственное значение и значения соседей (добавьте x 4 и mul x 1), и сохраняет результат во второй матрице.Как только вычисление закончено, указатели для матриц меняются местами, и одна и та же операция выполняется в течение конечного количества раз.Здесь у вас есть основной код:
#define GET(I,J) rMat[(I)*cols + (J)]
#define PUT(I,J) wMat[(I)*cols + (J)]
for (cur_time=0; cur_time<timeSteps; cur_time++) {
for (i=1; i<rows-1; i++) {
for (j=1; j<cols-1; j++) {
PUT(i,j) = 0.2f*(GET(i-1,j) + GET(i,j-1) + GET(i,j) + GET(i,j+1) + GET(i+1,j));
}
}
// Change pointers for next iteration
auxP = wMat;
wMat = rMat;
rMat = auxP;
}
Рассматриваемый случай использует фиксированное количество 500 временных шагов (внешних итераций) и размер матрицы 8192 строк и 8192 столбцов, но проблема сохраняется при изменении числаtimeSteps или размер матрицы.Обратите внимание, что я измеряю только время этой конкретной части алгоритма, поэтому чтение матрицы из файла и ничего другого влияет на измерение времени.
Что происходит, так это то, что я получаю разное время в зависимости от того, какой тип матрицы я используюполучая гораздо худшую производительность при использовании типа Zero (каждая другая матрица работает так же, как и тип NonZero, поскольку я уже пытался сгенерировать матрицу, полную случайных значений).
Я уверен, что это операция умножения,как будто я удаляю это и оставляю только добавления, они выполняют то же самое.Обратите внимание, что с нулевым типом матрицы, большинство типов результата сумма будет равна 0, поэтому операция будет «0,2 * 0».
Это поведение, конечно, странно для меня, так как я думал, что плавающийТочечные операции не зависели от значений операндов, что здесь не выглядит так.Я также пытался захватить и показать исключения SIGFPE в случае, если это была проблема, но я не получил никаких результатов.
В случае, если это помогает, я использую процессор Intel Nehalem и gcc 4.4.3.