0

Я занимаюсь научным вычислением и должен хранить скорости частиц. Чтобы сохранить 3 компонента, следует ли использовать 3 разных массива или один массив 1x3? Не повлияет ли это на мои вычисления?Один массив NxM или N массивов размера M?

Мое количество частиц будет большим, может даже подняться до 1e10 или более. Я буду использовать C++.

+3

Это очень зависит от способа доступа к данным. Существуют разные алгоритмы, которые будут полезны в любом случае из-за кеширования среди других факторов. – twalberg

+0

Ваше имя говорит NxM, но ваше тело говорит 1x3. Почему вы используете массив 1x3? Вы имели в виду Nx3 в теле? – user2357112

+0

Это частный случай многолетнего объекта Array-Of-Structures vs Structure-of-Arrays. Как говорит @twalberg, это зависит только от доступа вашего массива. Если вы будете работать по одному измерению больше, чем другие, - все (скажем) x-компоненты скоростей вместе, как и все компоненты скорости каждой частицы - имеет смысл держать эти данные близко друг к другу. Но обратите внимание, что здесь вы получите эту выгоду, если бы ваш массив был упорядочен как (например) 'double vel [NPTS] [NDIMS]' vs 'double vel [NDIMS] [NPTS]' - на самом деле отдельные массивы 'vx [NPTS ], vy [NPTS], vz [NPTS] 'было бы болью. –

ответ

0

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

В C++, как и в добром старшем C, память выделяется в одном большом куске (мин. 10240 байт) внутренне на brk или sbrk. Представьте себе, что вы ранее выделили и освободили некоторую память.

Корпус 1: вы создаете 3 массива. Скорее всего, среди используемых было бы несколько бесплатных кусков. Таким образом, он будет в основном перебирать список свободных кусков и размещать их в соответствии с алгоритмом, вероятно, лучше всего подходит (, но не только). В любом случае, это могло бы (или могло бы, так как во время выполнения нет четкого ответа) разбросайте их по уже выделенной памяти. Скажем, что 1 находится посередине, а остальные два - в конце.

Корпус 2: вы создаете 1 массив. Тогда он будет выделен в одном месте. Или недавно приобретенное хранилище или имеющееся.

Итак, я бы пошел с 2x мерным массивом 1x3. Таким образом, вы получите выгоду от местоположения ссылочного принципа, в частности местонахождение памяти.

Однако, как я уже сказал, вы должны быть уверены, что использование 2-мерного массива не повредит читаемости с точки зрения возможности подключения данных.

Надеюсь, что это проливает свет!

+1

Я считаю, что современные распределители обычно используют 'mmap', а не' sbrk'. В целом, ваш совет кажется разумным. На процессоре один 3-компонентный массив должен быть только немного быстрее, чем 3 1-компонентных. Однако на графическом процессоре (думаю, OpenCL или Cuda) это будет значительно быстрее, в основном из-за отсутствия кэширования глобальной памяти. –

+0

Да, согласитесь. Я просто старался быть максимально простым. – user8

+0

'[1] [3]'? Какие? Вы принимаете N = 1? Или вы думаете, что каждая частица получает свой собственный массив/набор массивов? Варианты здесь представляют собой один массив Nx3 для всех данных скорости частиц или 3 массива длины N, представляющих компоненты x, y и z всех скоростей частиц. – user2357112

 Смежные вопросы

  • Нет связанных вопросов^_^