使用PetscMalloc2(PetscMallocX)代替PetscMalloc两次(X次)的经验法则是什么?块是否具有相似的大小,或者同时将它们分配在一起是否总是更有效?手册说"分配2(X)块内存,两者都与PETSC_MEMALIGN"对于定义,但对于我来说,作为PETSc和HPC问题的新手并不是很重要。我一直认为编译器会处理这些问题。
答案 0 :(得分:2)
见http://www.mcs.anl.gov/petsc/petsc-current/include/petscsys.h.html#PetscMalloc2,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
之间的分配只能被调用一次,如果在代码中多次调用此函数会更好。如果你偶尔给它调用一次,它就不会有太大变化!
再见,