Эффективный способ проецирования векторов на блок-блок - PullRequest
2 голосов
/ 05 июля 2011

Я переопределяю функцию Matlab в C по соображениям производительности.Теперь я ищу наиболее эффективный способ вычисления проекции вектора на блок-блок.

В терминах C я хочу вычислить

double i = somevalue;
i = (i >  1.) ?  1. : i;
i = (i < -1.) ? -1. : i;

, и так как у меня естьчтобы сделать эту операцию несколько миллионов раз, мне интересно, что может быть наиболее эффективным способом для достижения этой цели.

Ответы [ 3 ]

2 голосов
/ 05 июля 2011

Если вы используете 686, ваш компилятор, вероятно, преобразует условное выражение в инструкцию CMOV, что, вероятно, достаточно быстро.

См. Вопрос Самый быстрый способ зафиксировать реальное значение (с фиксированной / плавающей точкой)? для экспериментов. @ Spat также предлагает инструкции MINSS / MINSD и MAXSS / MAXSD, которые могут быть доступны как встроенные функции для вашего компилятора. Это инструкции SSE, и они могут быть вашим лучшим выбором при условии, что вы находитесь на 686.

1 голос
/ 05 июля 2011

Если вы / «компилятор» используете двойной формат IEEE 754, я думаю, что чтение первого бита (знакового бита) в памяти двойного кода, вероятно, является наиболее прямым способом. Тогда вам не понадобятся дополнительные операции round или деления.

0 голосов
/ 05 июля 2011

Рассматривали ли вы инструкции SSE для ускорения вашего кода?

Также вы могли бы использовать OpenMP для распараллеливания вашего кода и, следовательно, для его ускорения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...