Greetings! I made a small program for particle transport and have a question. How the code work: i choose how much particle to handle, then take buffer size and do loop for this buffer untill particle count become 1e9(5e9 for blue). On each step buffer kills particles and refill to selected size.
There a two versions of allocation my class for particle to use - work1 and work 2. As you see on plot, work1 works significantly slower then work2 realisation. What is the difference (as i see it)? work1 made allocation of class for every item by itself, while work2 made it by myself. Seems like fastest approach is wrong, may be increased memory usage or something. So how to make work1 faster. Or there is another way to transport data on device which i used to only read.
Another question, why after 300k buffer size time per particle become arizing? I thought it should be constant as we don’t see the SYCL overhead?
work2
struct Geometry{
int sizeX;
int sizeY;
int sizeZ;
};
class SYCLGrid{
public:
SYCLGrid(accessor<double, 1, access::mode::read> alenX,
accessor<double, 1, access::mode::read> alenY,
accessor<double, 1, access::mode::read> alenZ, Geometry geo, accessor<int, 3, access::mode::read> sc) : lenX(alenX[0]), lenY(alenY[0]), lenZ(alenZ[0]), geom(geo){
scene = sc;
};
double lenX;
double lenY;
double lenZ;
Geometry geom;
accessor<int, 3, access::mode::read> scene;
private:
protected:
};
class SYCLNucleiCom : public SYCLNucleiRay{
public:
SYCLNucleiCom(accessor<int,1, access::mode::read> Z, accessor<int,1, access::mode::read> A, accessor<double,1, access::mode::read> Mass
, accessor<double,1, access::mode::read> aphE, accessor<double,1, access::mode::read> aphCS , accessor<double,1, access::mode::read> aEPICSphE
, accessor<double,1, access::mode::read> aEPICSphCS, accessor<double,1, access::mode::read> aCSLE1, accessor<double,1, access::mode::read> aCSLE2
, accessor<double,1, access::mode::read> aImportantShells1, accessor<double,1, access::mode::read> aImportantShells2 ,accessor<double,1, access::mode::read> aHighParams
, accessor<double,1, access::mode::read> aLowParams, accessor<double,1, access::mode::read> aCSray1, accessor<double,1, access::mode::read> aCSray2
, accessor<double,1, access::mode::read> aEPICSrayCS1, accessor<double,1, access::mode::read> aEPICSrayCS2, accessor<double> aEPICScompCS1
, accessor<double> aEPICScompCS2, accessor<double> abiggsP, accessor<double> abiggs
, accessor<double> aCScomp1, accessor<double> aCScomp2, accessor<double> aidMap
, accessor<double> abindingMap, accessor<double> aoccupancyPdfMap)
:SYCLNucleiRay( Z, A, Mass
, aphE, aphCS , aEPICSphE
, aEPICSphCS, aCSLE1, aCSLE2
, aImportantShells1, aImportantShells2
, aHighParams, aLowParams,aCSray1,aCSray2,aEPICSrayCS1,aEPICSrayCS2){
EPICScompCS1 = aEPICScompCS1;
EPICScompCS2 = aEPICScompCS2;
biggsP = abiggsP;
biggs = abiggs;
CScomp1 = aCScomp1;
CScomp2 = aCScomp2;
idMap = aidMap;
bindingMap = abindingMap;
occupancyPdfMap = aoccupancyPdfMap;
};
double GetComCS(double En){
if(En >= EPICScompCS1[0] || En <= EPICScompCS1[EPICScompCS1.size()-1]){
for(int i = 0; i < EPICScompCS1.size()-1; ++i){
if(En >= EPICScompCS1[i] && En < EPICScompCS1[i+1]){
return EPICScompCS2[i];
break;
}
}
}
};
//compton params
accessor<double> EPICScompCS1;
accessor<double> EPICScompCS2;
accessor<double> biggsP;
accessor<double> biggs;
accessor<double> CScomp1;
accessor<double> CScomp2;
accessor<double> idMap;
accessor<double> bindingMap;
accessor<double> occupancyPdfMap;
//double* componentsArr;
private:
protected:
};
template<typename T>
class SYCLMaterial{
public:
SYCLMaterial(T& n, accessor<double, 1, access::mode::read> dens) : nuc(n), density(dens[0]){};
T nuc;
double density;
private:
protected:
};
H.parallel_for(N, [=](id<1> index){
Geometry geom{asizeX[0],asizeY[0],asizeZ[0]};
SYCLGrid lattice(alenX,alenY,alenZ,geom, ascene);
SYCLNucleiCom nuc(aZ,aA,aMass, massPh[0], massPh[1], massPh[2], massPh[3], massPh[4], massPh[5], massPh[6], massPh[7], massPh[8], massPh[9]
, massRay[0], massRay[1], massRay[2], massRay[3]
, massCom[0], massCom[1], massCom[2], massCom[3], massCom[4], massCom[5], massCom[6], massCom[7], massCom[8]);
SYCLMaterial m1(nuc,aDensity1);
SYCLMaterial<SYCLNucleiCom> mas[1] = {m1};
Step::apply(photons[index],index,lattice, mas);
});
work1
This text will be hidden
struct SYCLGeometry{
accessor<int, 1, access::mode::read> sizeX;
accessor<int, 1, access::mode::read> sizeY;
accessor<int, 1, access::mode::read> sizeZ;
};
class SYCLGrid{
public:
SYCLGrid(accessor<double, 1, access::mode::read> alenX,
accessor<double, 1, access::mode::read> alenY,
accessor<double, 1, access::mode::read> alenZ, SYCLGeometry geo, accessor<int, 3, access::mode::read> sc) : lenX(alenX), lenY(alenY), lenZ(alenZ), geom(geo){
scene = sc;
};
accessor<double, 1, access::mode::read> lenX;
accessor<double, 1, access::mode::read> lenY;
accessor<double, 1, access::mode::read> lenZ;
SYCLGeometry geom;
accessor<int, 3, access::mode::read> scene;
private:
protected:
};
class SYCLNucleiCom : public SYCLNucleiRay{
public:
SYCLNucleiCom(accessor<int,1, access::mode::read> Z, accessor<int,1, access::mode::read> A, accessor<double,1, access::mode::read> Mass
, accessor<double,1, access::mode::read> aphE, accessor<double,1, access::mode::read> aphCS , accessor<double,1, access::mode::read> aEPICSphE
, accessor<double,1, access::mode::read> aEPICSphCS, accessor<double,1, access::mode::read> aCSLE1, accessor<double,1, access::mode::read> aCSLE2
, accessor<double,1, access::mode::read> aImportantShells1, accessor<double,1, access::mode::read> aImportantShells2 ,accessor<double,1, access::mode::read> aHighParams
, accessor<double,1, access::mode::read> aLowParams, accessor<double,1, access::mode::read> aCSray1, accessor<double,1, access::mode::read> aCSray2
, accessor<double,1, access::mode::read> aEPICSrayCS1, accessor<double,1, access::mode::read> aEPICSrayCS2, accessor<double> aEPICScompCS1
, accessor<double> aEPICScompCS2, accessor<double> abiggsP, accessor<double> abiggs
, accessor<double> aCScomp1, accessor<double> aCScomp2, accessor<double> aidMap
, accessor<double> abindingMap, accessor<double> aoccupancyPdfMap)
:SYCLNucleiRay( Z, A, Mass
, aphE, aphCS , aEPICSphE
, aEPICSphCS, aCSLE1, aCSLE2
, aImportantShells1, aImportantShells2
, aHighParams, aLowParams,aCSray1,aCSray2,aEPICSrayCS1,aEPICSrayCS2){
EPICScompCS1 = aEPICScompCS1;
EPICScompCS2 = aEPICScompCS2;
biggsP = abiggsP;
biggs = abiggs;
CScomp1 = aCScomp1;
CScomp2 = aCScomp2;
idMap = aidMap;
bindingMap = abindingMap;
occupancyPdfMap = aoccupancyPdfMap;
};
double GetComCS(double En) const {
if(En >= EPICScompCS1[0] || En <= EPICScompCS1[EPICScompCS1.size()-1]){
for(int i = 0; i < EPICScompCS1.size()-1; ++i){
if(En >= EPICScompCS1[i] && En < EPICScompCS1[i+1]){
return EPICScompCS2[i];
break;
}
}
}
};
//compton params
accessor<double> EPICScompCS1;
accessor<double> EPICScompCS2;
accessor<double> biggsP;
accessor<double> biggs;
accessor<double> CScomp1;
accessor<double> CScomp2;
accessor<double> idMap;
accessor<double> bindingMap;
accessor<double> occupancyPdfMap;
private:
protected:
};
template<typename T>
class SYCLMaterial{
public:
SYCLMaterial(T& n, accessor<double, 1, access::mode::read> dens) : nuc(n), density(dens){};
T nuc;
accessor<double, 1, access::mode::read> density;
private:
protected:
};
SYCLGeometry geom{asizeX,asizeY,asizeZ};
SYCLGrid lattice(alenX,alenY,alenZ,geom, ascene);
SYCLNucleiCom nuc(aZ,aA,aMass, massPh[0], massPh[1], massPh[2], massPh[3], massPh[4], massPh[5], massPh[6], massPh[7], massPh[8], massPh[9]
, massRay[0], massRay[1], massRay[2], massRay[3]
, massCom[0], massCom[1], massCom[2], massCom[3], massCom[4], massCom[5], massCom[6], massCom[7], massCom[8]);
SYCLMaterial m1(nuc,aDensity1);
SYCLMaterial<SYCLNucleiCom> mas[1] = {m1};
H.parallel_for(N, [=](id<1> index){
if(photons[index].pr == 1 && photons[index].state != 0){
Proc::rayleigh(photons[index],index, mas);
}
});
d