Какова самая быстрая векторная/матричная математическая библиотека в C для игры iPhone?

Как заголовок, я нахожу векторную/матричную библиотеку в C оптимизированной для процессоров iPhone/iPod. Или просто обычно быстро.

---(редактирование)---

Я сожалею о неясном вопросе. Я ищу быстрый lib для коммерческих игр для iPhone/iPod. Таким образом, lib GPL не может использоваться.

Однако я прекращу находить самый быстрый lib, это, возможно, бессмысленный.

8
задан Eonil 10 February 2010 в 18:40
поделиться

2 ответа

Теперь (2010.06.26) Платформа Accelerate включена в iOS4, поэтому доступны функции vDSP / BLAS.

При этом используется аппаратная функция (ЦП или SIMD) для ускорения операций с плавающей запятой, поэтому с ее помощью можно получить более высокую скорость (в среднем в 2 ~ 4,5 раза, максимум в 8 раз) и снизить потребление энергии (максимум 0,25 раза).

Спасибо людям за другие ответы.

5
ответ дан 5 December 2019 в 21:19
поделиться

Первый пример может быть реализован с использованием только регистров CPU. К ним можно получить доступ миллиарды раз в секунду. Во втором примере используется столько памяти, что она, безусловно, переполняет L1 и, возможно, L2 кэш (в зависимости от модели ЦП). Это будет медленнее. Тем не менее, 15 мс/100.000 записей выходит до 1,5 нс на запись - 667 МГц эффективно. Это не медленно.

-121--4557506-

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

Вы могли бы инкапсулировать это в метод:

private void CheckTotalPrice(decimal oldPrice)
{
    if(this.TotalPrice != oldPrice)
    {
         this.RaisePropertyChanged("TotalPrice");
    }
}

Тогда вам нужно вызвать это от других мутирующих членов:

var oldPrice = this.TotalPrice;
// mutate object here...
this.CheckTotalPrice(oldPrice);
-121--3879691-

Зависит от ваших потребностей, если вы просто используете прямую математику с плавающей точки, вы, вероятно, обнаружите, что компилятор будет использовать программное обеспечение с плавающей точки, которое будет очень медленным. Таким образом, первый шаг - это убедиться, что вы используете аппаратный блок с плавающей точки, который доступен в процессоре iPhone.

Шаг второй - это использование уже хорошо зарекомендовавшей себя библиотеки, есть несколько, Хасан уже предоставил вам ссылку на GNU GSL, что приятно.

Следующим шагом будет использование возможностей VFP SIMD. VFP фактически не является SIMD, но предоставляет команды, подобные SIMD, для которых отдельные операции выполняются последовательно. Преимущество использования этих команд состоит в том, что текст программы будет короче, что позволит лучше использовать кэш команд и меньше проблем при отсутствии предсказаний ветвей и т.д. Однако я не знаю о какой-либо векторной библиотеке, использующей преимущества VFP, вы должны сделать хороший поиск и возможно написать свой собственный, если он не доступен.

Наконец, если вам еще нужно больше скорости, вы захотите использовать настоящий SIMD-блок в процессоре iPhone. Однако эта единица является не единицей с плавающей точки, а целочисленной единицей. Таким образом, если вы хотите реальные числа, вы застрянете с фиксированной точкой, это зависит от вашего приложения, сможете ли вы уйти с этим. Опять же, я не знаю ни одной векторной библиотеки, обеспечивающей арифметику с фиксированной точкой, используя модуль SIMD, предоставляемый процессором iPhone, так что опять же вам понадобится тщательный поиск и, возможно, испачкать руки самостоятельно.

2
ответ дан 5 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: