AcceleratedLattice
AcceleratedLattice3D 类似于MultiBlockLattice3D。同理,AtomicAcceleratedLattice3D也是类比于BlockLattice3D。
在原有grid上定义的
Cell<T,Descriptor> *rawData;
Cell<T,Descriptor> ***grid;
成为了
T *populations, *tmpPopulations;
T ****populationGrid, ****tmpPopulationGrid;
External *externalScalars;
External **externalScalarGrid;
Dynamics<T,Descriptor> dynamicsArray;
Dynamics<T,Descriptor> ***dynamicsGrid;
在碰撞迁移的时候,从populations里面读取数据,再碰撞迁移到tmpPopulations。当迭代完成后,populations和tmpPopulations的值会互换。
程序使用
在使用时,代码之前需要添加更多库。
#include "atomicBlock/acceleratedDefinitions.h"
#define ACCELERATOR PAR_ALG
//#define ACCELERATOR OMP_HOMOGENEOUS
#include "palabos3D.h"
#include "palabos3D.hh"
然后将MultiBlockLattice3D换成AcceleratedLattice3D。当然这么做的话,数据处理器是无法在AcceleratedLattice3D上运作的,因为Palabos的数据是array-of-structure,而structure-of-array数据更适合GPU。
由此思路是前后处理可以用MultiBlockLattice,但是碰撞和迁移用AcceleratedLattice。可通过AcceleratedLattice3D<T, DESCRIPTOR> accLattice(lattice);
将MultiBlockLattice3D的lattice的数据复制到AcceleratedLattice3D中。再通过accLattice.writeBack(lattice);
写入回去。
Dynamics<T,DESCRIPTOR> *dyn = new BGKdynamics<T,DESCRIPTOR>(omega);
MultiBlockLattice3D<T, DESCRIPTOR> lattice (nx, ny, nz, dyn); // Set up a non-accelerated multi-block lattice
simulationSetup(lattice); // Do all pre-processing on the multi-block lattice
AcceleratedLattice3D<T, DESCRIPTOR> accLattice(lattice); // Copy all data to an accelerated lattice
for (plint iT=0; iT<tmax; ++iT) {
if (doOutput) {
accLattice.writeBack(lattice); // Copy back to the multi-block lattice
writeVTK(lattice); // Perform output from the multi-block lattice
}
accLattice.collideAndStream(); // Collision-streaming is done on the accelerated lattice
}
更多
如果想要在gpu加速的block上执行数据处理器,那么还需要更多调整,可参考原链接:
https://gitlab.com/unigehpfs/palabos/-/tree/master/examples/80days