PetscMalloc против PetscMallocX
Каково практическое правило использования PetscMalloc2 (PetscMallocX) вместо PetscMalloc дважды (X раз)? Должны ли куски иметь одинаковые размеры или всегда эффективнее размещать их вместе / одновременно? В руководстве говорится "Выделение 2 (X) блоков памяти, выровненных по PETSC_MEMALIGN" для определения, но для меня, как новичка для PETSc и проблем с высокопроизводительными высокопроизводительными вычислениями, это мало что значит для меня. Я всегда предполагал, что компиляторы позаботятся о таких проблемах.
1 ответ
См. http://www.mcs.anl.gov/petsc/petsc-current/include/petscsys.h.html, ligne 566:
#if defined(PETSC_USE_DEBUG)
#define PetscMalloc2(m1,t1,r1,m2,t2,r2) (PetscMalloc((m1)*sizeof(t1),r1) || PetscMalloc((m2)*sizeof(t2),r2))
#else
#define PetscMalloc2(m1,t1,r1,m2,t2,r2) ((*(r2) = 0,PetscMalloc((m1)*sizeof(t1) (m2)*sizeof(t2)+(PETSC_MEMALIGN-1),r1)) || (*(r2) = (t2*)PetscAddrAlign(*(r1)+m1),0))
#endif
Если вы находитесь в режиме отладки, PetscMalloc2
эквивалентно двум PetscMalloc
,
Иначе PetscMalloc2
гарантирует, что оба буфера находятся в памяти один за другим, с небольшим пространством из-за выравнивания памяти. http://en.wikipedia.org/wiki/Data_structure_alignment Распределение через PetscMalloc
вызываться только один раз, что было бы лучше, если бы вы вызывали эту функцию много раз в своем коде. Если вы будете звонить время от времени, это не сильно изменится!
До свидания,