나는 지난주에 다시 작성하여 가능한 한 빨리 실행하도록 코드를 작성했습니다.대용량 모델 최적화 - 병렬 처리를 시도하는 중
코드는 회절 레이저 빔을 모델링하며 그 본질은 많은 2D 1280 * 1280 슬라이스에 걸쳐 640 * 640 커널의 컨볼 루션입니다. 각 슬라이스는 빔 축을 따라 새 위치가됩니다.
최적화 단계는 내 기능을 컴파일하는 것이었고 두 번째 단계는 Mathematica가 큰 데이터 목록으로 작업하는 것을 좋아한다는 것을 배우고 있었기 때문에 여러 레이어의 3D 공간을 순차적으로 슬라이스가 아닌 한 번에 전달했습니다.
그러나 이것은 내 RAM을 먹었습니다! 여기
내 전류 설정 :Func2[K_ , ZRange_] :=
Module[{layers = Dimensions[ZRange][[1]]},
x = ConstantArray[Table[x, {x, -80, 80, 0.125}, {y, -80, 80, 0.125}], {layers}];
y = ConstantArray[Table[y, {x, -80, 80, 0.125}, {y, -80, 80, 0.125}], {layers}];
z = Table[ConstantArray[z, {1281, 1281}], {z, ZRange}];
UTC = Func3[x, y, z];
Abs[ListConvolve[K, #] & /@ UTC]
]
Func3 = Compile[{{x, _Real}, {y, _Real}, {z, _Real}},
Module[{Sr2R2 = Sqrt[x^2 + y^2 + z^2]},
0.5 (1. + z/Sr2R2) Exp[2 \[Pi] I (Sr2R2 - z)]/Sr2R2],
RuntimeAttributes -> {Listable},
CompilationTarget -> "C"
];
ZRangeList = {{20., 19., 18., 17., 16., 15., 14., 13., 12., 11.},
{10., 9., 8., 7., 6., 5., 4., 3., 2., 1.}};
results = Table[Func2[kernel, ZList], {ZList, ZRangeList}];
일부 설명 : 나는 가능한 한 많이 컴파일 할 수 있도록 원하는대로
- 작품은 두 가지 기능으로 분할됩니다.
- Z 값은 함수의 여러 레이어를 한 번에 평가할 수 있도록 목록으로 나뉩니다.
몇 가지 질문 :
- 방법이 더 빨리 만들 것?
- 실행하면, 두 개의 코어가 사용되지만 하나의 mathematica 커널이 사용됩니다. ParallelTable로 실행할 경우 여러 커널을 실행하지만 더 많은 RAM을 먹고 궁극적으로 느립니다.
- 가능한 한 많은 코어에서 실행할 수 있기를 원합니다. LightweightGrid가 실행 중입니다. 어떻게 할 수 있습니까?
- 다른 차원의 컴파일 된 함수 목록을 전달할 수없는 이유는 무엇입니까? 나 즉시 밖으로 점프