현재 내부 루프에 결과를 저장해야하는 조건이있는 경우 루프 집합을 병렬화하는 빠르고 안정적인 방법을 찾으려고합니다. 코드는 3D 그리드에서 엄청난 양의 점들을 통과해야합니다. 이 볼륨 내의 일부 지점에 대해 다른 조건 (각도 확인)을 확인해야하며이 조건이 충족되면 밀도를 계산해야합니다. Openmp는 순서대로 출력 된 for 루프를 중첩했습니다.
가장 빠른 방법
지금까지 최대 규모의 루프뿐만 아니라뿐만 아니라 CPU를 많이 사용하는 함수를 호출하는 가장 안쪽 루프 (phiInd)에 대한#pragma omp parallel for private (x,y,z) collapse(3)
루프에 대한 모든 외부 또는
#pragma omp parallel for
했다.
밀도 루프의 내부에 밀도 값을 저장해야합니다. 그런 다음 densityarray는 나중에 별도로 저장됩니다. 내 문제는 지금 내가 설정 한 스레드의 수에 따라 y 밀도 배열이 달라진다는 것입니다. 직렬 버전과 단 하나의 스레드 만있는 openmp 실행은 동일한 결과를 보입니다. 스레드 수를 늘리면 같은 지점에서 결과가 나오지만 그 결과는 직렬 버전과 다릅니다.
나는 #pragma omp for ordered
이 있다는 것을 알고 있지만 계산 속도가 너무 느립니다. 내 포인트 (x, y, z)에 따라 검색 결과를 정렬하면서이 루프를 병렬화 할 수 있습니까? 또는 더 명확하게 : 스레드 번호를 늘리면 내 결과가 변경되는 이유는 무엇입니까?
double phipoint, Rpoint, zpoint;
double phiplane;
double distphi = 2.0 * M_PI/nPlanes; //set desired distace to phi to assign point to fluxtubeplane
double* densityarr = new double[max_x_steps * max_y_steps * max_z_steps];
for (z = 0; z < max_z_steps; z++) {
for (x = 0; x < max_x_steps; x++) {
for (y = 0; y < max_y_steps; y++) {
double x_center = x * stepSizeGrid - max_x/2;
double y_center = y * stepSizeGrid - max_y/2;
double z_center = z * stepSizeGrid - max_z/2;
cartesianCoordinate* pos = new cartesianCoordinate(x_center, y_center, z_center);
linearToroidalCoordinate* tor = linearToroidal(*pos);
simpleToroidalCoordinate* stc = simpleToroidal(*pos);
phipoint = tor->phi;
if (stc->r <= 0.174/*0.175*/) {//check if point is in vessel
for (int phiInd = 0; phiInd < nPlanes; ++phiInd) {
phiplane = phis[phiInd];
if (abs(phipoint - phiplane) <= distphi) {//find right plane for point
Rpoint = tor->R;
zpoint = tor->z;
densityarr[z * max_y_steps * max_x_steps + x * max_y_steps + y] = TubePlanes[phiInd].getMinDistDensity(Rpoint, zpoint);
}
}
}
delete pos, tor, stc;
}
}
}
여기서'phipoint' /'phipane'이 정의되어 있습니다. 'densityarr'는 어떤 타입입니까? – Zulan
그 루프 전에. 'phipoint'와'phipane'은 모두 두 배입니다. 'densityarr'는 double *입니다 .. .. 'double phiplane, phipoint; double * densityarr = new double [max_x_steps * max_y_steps * max_z_steps]; ' – LeBo