Я пишу систему частиц на основе OpenCL для ускорения визуализации крупномасштабных сетей. По сути, это двухфазная проблема, когда первая фаза применяет отрицательную гравитацию к каждой частице (типичная проблема n-тел), поэтому все они отталкиваются, а вторая фаза притягивает частицы на основе ребер (или пружин) между частицами.
Во время каждой итерации алгоритма гравитации местоположение каждой частицы, представленное в виде пары поплавков, зависит от расстояния до другой частицы (классическая физическая модель, без сопротивления, что упрощает задачу).
В ситуации, когда человек имеет идеально разнесенный квадратный массив частиц, применение силы тяжести должно привести к симметрии по осям X и Y. Это верно в начале применения гравитации, но со временем отсутствие точности, присущей сложению большого количества чисел с плавающей запятой, приводит к небольшим неоднородным отклонениям. Это, в свою очередь, распространяется по всей системе из n тел и происходит потеря симметрии.
Один из простых способов избежать этого - использовать числа с двойной точностью, однако GeForce 9600M GT на моем MacBook Pro не поддерживает числа с двойной точностью. Итак, как можно решить такие проблемы в OpenCL? Я думал об обрезании чисел с плавающей запятой, которые я добавляю к нескольким десятичным знакам, чтобы избежать этой проблемы, но это выглядит немного странно.