Я провожу некоторый тест производительности на научном приложении и пытаюсь учесть все элементы, которые могут повлиять на производительность приложения (например, скорость процессора в иерархии размера кэша … строка кэша и все, что может быть связано с производительностью). Этот вопрос мне приходит в голову, хотя он может быть глупым, но я хотел бы сделать его очевидным для меня.
*Вопрос:*
если я не прав, поправьте меня, пожалуйста. Стоимость обработки int и float или double различается на процессоре, и это из-за использования процессора с плавающей запятой (для вычисления значений с плавающей запятой). Теперь я хочу знать, есть ли разница между заполнением двух двумерных матриц одним и тем же значением типа float или double и умножением их или заполнением их случайным или двойным значением, а затем умножением их. Доза компилятора использует кеширование для матрицы, все элементы которой имеют одинаковые значения?
В целом обработка обработки плавающего значения, как (A.B) в которых A и B могут быть числами с разным размером в цифрах, если размер A и B влияет на время обработки (например, умножение) или нет? и если есть разница в дозе, важно учитывать это или нет? ,
Я могу измерить производительность моего приложения, используя библиотеку счетчиков производительности, но из-за издержек используемой библиотеки вы не можете с уверенностью сказать, что изменение Instruction / flops относится к случайному значению или другому параметру, такому как I / Dcache miss, размер кэша, размер проблемы или другие параметры.
Используется машина Intel E4500.
компилятор g ++ 4.7.
Спасибо
Вы правы в том, что целочисленные и арифметические затраты с плавающей запятой различны, но не настолько, как можно предположить. Это сильно зависит от того, какой процессор используется для вычислений. Специально для процессоров Intel вы можете найти полезную информацию в «Справочном руководстве по оптимизации», доступном по адресу http://www.intel.com/products/processor/manuals/. В приложении C перечислены задержки для всех инструкций.
На ваш конкретный вопрос, если время вычисления умножения матриц зависит от того, содержат ли записи двух матриц одинаковые или случайные значения, ответ «нет». Если вы посмотрите на количество и последовательность инструкций, а также схему доступа к памяти во время выполнения вычислений, то в обоих случаях все одинаково. Компилятор обычно также не может воспользоваться тем, что все матрицы состоят из одних и тех же элементов, потому что умножение матриц должно охватывать все возможные случаи. (Хорошо, если вы не упакуете все — заполняя записи матрицы и само умножение — в одну функцию и исключив все побочные эффекты, такие как псевдонимы, тогда очень очень умный компилятор, возможно, сможет что-то из этого сделать, но мы не говорим об этом , право?)
Кроме того, размер в цифрах (я полагаю, вы имеете в виду десятичные цифры) не имеет значения. Каждая матричная запись представлена все из его 32 битов в случае чисел с плавающей запятой одинарной точности (или 64 битов в случае двойной точности).
Других решений пока нет …