Мне кажется, что я не совсем понимаю концепцию FLOPS. В CUDA SAMPLES есть Пример умножения матриц (0_Simple / matrixMul). В этом примере количество FLOP (операций с плавающей запятой) на умножение матрицы рассчитывается по формуле:
double flopsPerMatrixMul = 2.0 * (double)dimsA.x * (double)dimsA.y * (double)dimsB.x;
Таким образом, это означает, что для того, чтобы умножить матрицу A(n x m)
над B(m x k)
нам нужно сделать: 2*n*m*k
операции с плавающей точкой.
Однако для того, чтобы вычислить 1 элемент полученной матрицы C (n x k)
нужно выполнить m
умножение и (m-1)
операции сложения. Итак, общее количество операций (для расчета n x k
элементы), есть m*n*k
умножения и (m-1)*n*k
дополнения.
Конечно, мы могли бы установить количество дополнений к m*n*k
а также общее количество операций будет 2*n*m*k
половина из них — умножения и половина сложений.
Но, я думаю, умножение в вычислительном отношении дороже, чем сложение. Почему эти два типа операций перепутаны? Это всегда так в информатике? Как можно учитывать два разных типа операций?
Извините за мой английский)
Короткий ответ: да, они учитывают как умножения, так и сложения. Несмотря на то, что большинство процессоров с плавающей запятой имеют смешанную операцию умножения / сложения, они все равно считают умножение и сложение как две отдельные операции с плавающей запятой.
Это часть того, почему люди десятилетиями жаловались на то, что FLOP — это в основном бессмысленное измерение. Чтобы даже немного значить, вам почти необходимо указать какой-то конкретный фрагмент кода, для которого вы измеряете FLOP (например, «Linpack gigaflops»). Даже в этом случае вам иногда требуется довольно жесткий контроль над такими вещами, как то, что позволяет оптимизация компилятора, чтобы гарантировать, что измеряемая вами величина — это действительно скорость машины, а не способность компилятора просто исключать некоторые операции.
В конечном счете, именно такие проблемы привели к тому, что организации были сформированы для установки контрольных показателей и правил о том, как эти контрольные показатели должны выполняться и сообщаться о результатах (например, SPEC). В противном случае может быть трудно вообще быть уверенным, что результаты, которые вы видите для двух разных процессоров, действительно сопоставимы в любом значимом смысле. Даже с этим, сравнения могут быть трудными, но без таких вещей они могут граничить с бессмысленным.