Предположим, у меня есть два вектора, представленные двумя массивами типа double
, каждый из которых равен 2. Я бы хотел добавить соответствующие позиции. Предположим, векторы i0
и i1
, я хотел бы добавить i0[0] + i1[0]
и i0[1] + i1[1]
вместе.SSE Загрузка и добавление
Поскольку тип double
, мне нужны два регистра. Хитрость заключалась бы в том, чтобы поставить i0[0]
и i1[0]
, и i0[1]
и i1[1]
в другой и просто добавьте реестр с собой.
Мой вопрос, если я позвоню _mm_load_ps(i0[0])
и затем _mm_load_ps(i1[0])
, будет это место их в верхних и нижних 64 бит отдельно, или он будет заменить регистр со вторым load
? Как бы поместить оба дубликата в один и тот же регистр, поэтому я могу позвонить add_ps
после?
Спасибо,
Можно, конечно, использовать '_mm_load_ps', но вы рискуете снижение производительности на гипотетическом будущем процессор, который выполнен таким образом, что есть домен байпас штраф между одно- и операции с плавающей запятой с двойной точностью. Я не знаю никаких планов для такого процессора, но это не означает, что никто никогда не будет реализован; поэтому существуют различные операции загрузки. По правде говоря, это пустая возможность, но зачем рисковать? –
Я согласен с тем, что существует риск ухудшения производительности для будущего процессора. Я бы предположил, что можно рассмотреть (например, меру) любое преимущество в производительности, которое должно быть получено с помощью «MOVPS» вместо «MOVPD» в зависимости от конкретного приложения. Если есть возможность использовать его сегодня, и нет никаких указаний на надвигающуюся архитектуру, для которой было бы наказание за это, я бы сделал это. Подобные нагрузки можно легко абстрагировать в тандеме, чтобы в будущем можно было автоматически переключиться на другую реализацию. –