mfa корректно по всей предпочтительной ширине, но использование более широких векторов обычно хорошо. Устройство будет последовательно выдавать инструкции для обработки в самых широких форматах, которые оно поддерживает, что хорошо, поскольку помогает скрыть задержку операции. Это гораздо более верно для графических процессоров и гораздо менее верно для процессоров: графические процессоры обычно имеют много регистров (> 1000).
Думайте о предпочтительной ширине как о ширине, которая гарантирует, что вы не будете "тратить" векторные полосы на процессорах векторной архитектуры - если у графического процессора есть векторные ALU, выдает инструкции, которые не используют всю ширину (скажем, используйте только первый элемент в векторе), затем другие строки могут остаться неиспользованными в этой инструкции, что приведет к потере потенциальной вычислительной мощности. Подумайте о SSE, где он может делать 4 добавления с одной инструкцией, но в результате вы получите только одно число, потому что вы не используете 3 из 4 частей вектора.
Компиляторы OpenCL (на векторном оборудовании ALU) пытаются реструктурировать ваш код для «векторизации», если вы не используете полную векторную ширину, но, очевидно, существуют ограничения для этого.
Конечно, используйте более широкие векторы только тогда, когда это кажется естественным в вашем алгоритме. Никогда не искажайте вашу программу, пытаясь использовать действительно широкие векторы.
Использование меньшего количества регистров тоже хорошая вещь, хотя, если вы используете слишком много регистров, это может ограничить количество волновых фронтов / деформаций, которые могут выполняться параллельно.
Использование векторов может фактически уменьшить давление в регистре, если авто-векторизатору не удается найти векторизованное решение в скалярном коде, в случае, если аппаратное обеспечение использует вектор ALU - вы «потеряете» меньше векторных линий, потому что больше подойдет в каждом регистре.