например, подсчет математических операций здесь:
for (int i = 0; i < 100; ++i)
{
for (int j = 0; j < 50; ++j)
{
X[i*xcol+j] = Y[i] * Z[j];
}
}
Должны ли мы считать операции как ++i
, i*xcol+j
и т. д. в нашем общем количестве gflops (прежде чем вы укажете на очевидную ошибку здесь, давайте на мгновение забудем строгое определение флопов) или нам нужен только count Y[i]*Z[j]
? Причина, по которой я спрашиваю об этом, состоит в том, что я читаю некоторые статьи, в которых они считают последнюю только gflops / maths ops здесь.
Когда вы выполняете работу для меня, все, что меня волнует, — это считать то, что я хочу. Меня не волнует подсчет ваших накладных расходов. В этом случае цель состоит в том, чтобы умножить каждое из Y на каждое из Z. Итак, вопрос в том, сколько умножений вы можете дать мне в секунду?
Мне все равно, нужно ли вам делать много вычислений индекса массива или вы найдете какой-то способ обойти их. Например, предположим, однажды вы выполняли 20 000 арифметических операций, чтобы дать мне 5000 умножений, и это заняло у вас одну секунду (слишком медленно, чтобы быть современным компьютером). Для меня это 5000 флопов в секунду. На следующий день вы придумали лучший способ написания своего кода, и вам понадобится всего 10 000 арифметических операций, чтобы получить мои 5000 умножений, и это займет у вас полсекунды. Это 10000 флопс в секунду.
Очевидно, я бы предпочел мои 5000 операций за полсекунды. Это единственные операции, которые учитываются.
Других решений пока нет …