Я пытаюсь понять, почему Visual Studio 2012 (x64) не хочет векторизовать преобразование из short
к float
, У кого-нибудь есть причина или выход?
//unsigned short* __restrict A,B,C,D
for (int j = 0; j < H*W;j++)
{
float Gs = D[j]-B[j];
float Gc = A[j]-C[j];
in[j]=atan2f(Gs,Gc);
}
информация C5002: цикл не векторизован по причине ‘1101’
РАЗРЕШАЮЩАЯ СПОСОБНОСТЬ
Время выполнения с использованием шорт и не векторизация о 800ms
Время конвертирования во все целые и автоматическая векторизация 140ms
(!!!)
От эта страница, Похоже, что ваш «цикл содержит не-векторизуемую операцию преобразования (может быть неявной)». Вы пытались сначала преобразовать в тип, который имеет ту же ширину, что и float
(такие как int
)?
По более конкретной причине см. Вот. По-видимому, в SSE нет прямого способа преобразовать регистр SSE, состоящий из вектора коротких замыканий, в вектор с плавающей точкой, однако есть инструкция, которая преобразует 32-разрядные целые числа в числа с плавающей точкой.
Других решений пока нет …