GSL: совместное использование ускорителей между сплайнами - PullRequest
0 голосов
/ 22 мая 2018

Я делаю много кубической сплайн-интерполяции, используя GSL .Скажем, у меня есть три независимые переменные a, b и c, все они сведены в таблицу в одних и тех же физических точках данных (это может быть один и тот же набор положений, измеренных в метрах, футах и ​​милях), а также две зависимые переменныеy и z, сведенные в таблицу в тех же точках.То есть данные для функций y(a), y(b), y(c), z(a), z(b) и z(c) сведены в таблицу.Теперь я создаю 6 кубических сплайнов для этих функций, как показано здесь для сплайна y(a):

gsl_interp_accel *acc = gsl_interp_accel_alloc();
gsl_spline *spline = gsl_spline_alloc(gsl_interp_cspline, size);
gsl_spline_init(spline, a, y, size);

, где size - размер массивов a и y (все шесть массивов).имеют одинаковый размер).

Мой вопрос: действительно ли мне нужен отдельный ускоритель для каждого сплайна?Это быстрее, и даже безопасно ли использовать акселератор для нескольких сплайнов?

1 Ответ

0 голосов
/ 24 мая 2018

Да, вам нужен ускоритель для каждого сплайна, и для вас небезопасен один и тот же ускоритель для нескольких сплайнов.Как вы уже догадались, я предполагаю, что ускоритель является предварительным условием, которое в лучшем случае замедлит интерполяцию при смешанном вводе.
Если вас интересует аспект производительности, связанный с созданием ускорителей и их частым освобождением, просто оставьтеускорители и сбрасывать их после каждого использования.
Что является большим приростом производительности, зависящим от размера вашего двоичного файла и других факторов, которые влияют на поиск в памяти, так это использование -DHAVE_INLINE=1 во время компиляции.Он будет вставлять gsl_interp_accel_find из заголовка, а не использовать скомпилированную версию в libgsl.

...