Этот вопрос предназначен для упакованных плавающих операций с одиночной записью с регистрами XMM/YMM в Haswell.
Итак, согласно потрясающей, потрясающей таблице составленный Агнером Фогом, я знаю, что MUL может выполняться как на портах p0, так и на p1 (с пропускной способностью recp 0,5), в то время как только ADD выполняется только на порту p1 (с пропускной способностью recp 1). Я могу исключить это ограничение, НО я также знаю, что FMA может выполняться либо на порту p0, либо на порту p1 (с пропускной способностью 0,5). Поэтому меня смущает, почему простой ADD будет ограничен только p1, когда FMA может использовать либо p0, либо p1, и он выполняет как ADD, так и MUL. Я неправильно понимаю таблицу? Или кто-нибудь может объяснить, почему так?
То есть, если я правильно понял, почему бы Intel просто не использовать операцию FMA в качестве основы как для простого MUL, так и для простого ADD, тем самым увеличив пропускную способность как для ADD, так и для MUL. В качестве альтернативы, что помешает мне использовать две одновременные независимые операции FMA для эмуляции двух одновременных независимых операций ADD? Какие штрафы связаны с выполнением ADD-by-FMA? Очевидно, что используется большее количество регистров (2 регистра для ADD против 3 регистров для ADD-by-FMA), но кроме этого?