특정 장치에서 병렬 할당()이 느립니다.안녕하세요 여러분,
특정 시스템과 결합하여 Parallel Assign()에 문제가 있는 것 같습니다.
JMP 16.1이 설치된 Windows 10 PC 3대에 액세스할 수 있습니다.
- 노트북: Core i5-8350U(4코어) @ 1.9GHz, 16GB Ram
- 기존 워크스테이션: Xeon E5-1660 v4(8코어) @ 3.2GHz, 256GB Ram
- 새로운 워크스테이션 Xeon W-2145(8코어) @3.7GHz, 128GB Ram
모든 시스템에서 다양한 문제 크기를 사용하여 테스트 스크립트의 병렬 버전과 순차 버전의 성능을 비교했습니다(아래 설명 참조).
결과는 의외로 나빴다. 내 노트북에서만 병렬 버전이 순차 버전보다 약간 빠르지만 워크스테이션에서는 최대 2배 이상 느립니다.
Parallel Assign()과 비슷한 성능 문제를 경험한 사람이 있습니까? 아니면 제가 잘못 사용하고 있는 걸까요? 여기서 무슨 일이 일어나고 있는 걸까요?
롭


n_different_ids = 100000;
<BR />// Just generate random data. Every 15 rows must be processed at the same time.
DT_Data = J( 15*n_different_ids, 9, 0 );
For ( i = 1, i <= n_different_ids, i++,
DT_Data[15*(i-1)+(1::15),0] = i + J( 15, 9, Random Normal() );
);
<BR />// some function
F_percentile = Function( {x , p},
x = Sort Ascending(x);
n = N Rows(x);
index = 1 + (n - 1) * p;
index_ibelow = Floor(index);
index_iabove = Ceiling(index);
h = index - index_ibelow;
result = (1 - h) * x[index_ibelow] + h * x[index_iabove];
result;
);
<BR />// parallel version
DT_Features = J( n_different_ids, 16, 0 );
start=tick seconds();
Parallel Assign( {
DT_Data = DT_Data,
F_percentile = Name Expr( F_percentile )
},
DT_Features[i,j] = (
i_same_group = Loc(DT_Data[15*(i-1)+(1::15), 1]);
data = DT_Data[15*(i-1)+i_same_group, 1+Ceiling(j/2)];
If (mod(j,2),
result = F_percentile(data, 0.95);
,
result = F_percentile(data, 0.05);
);
result;
)
);
time_parallel = tick seconds()-start;
Show(time_parallel);
Wait(0.1);
<BR />// sequential version
DT_Features = J( n_different_ids, 16, 0 );
start=tick seconds();
for(i=1,i<=n_different_ids,i++,
for(j=1,j<=16,j++,
i_same_group = Loc(DT_Data[15*(i-1)+(1::15), 1]);
data = DT_Data[15*(i-1)+i_same_group, 1+Ceiling(j/2)];
If (mod(j,2),
result = F_percentile(data, 0.95);
,
result = F_percentile(data, 0.05);
);
DT_Features[i,j] =result;
);
);
time_sequential = tick seconds()-start;
Show(time_sequential);
고급 통계 모델링자동화 및 스크립팅데이터 접근데이터 탐색 및 시각화대량 맞춤화품질 및 프로세스 엔지니어링결과 공유 및 전달Re: 특정 장치에서 Parallel Assign()이 느립니다.안녕 @ih ,
동의하다.
내 경우에는 아이를 설정하는 오버헤드가 별로 중요하지 않기 때문에 이를 최대한 효과적으로 만드는 데 많은 시간을 투자하지 않았습니다. 이 스크립트는 몇 분 동안만 실행되도록 만들어진 것이 아닙니다. 이 주제를 시작하기 전에 나는 당신이 제안한 대로 정확하게 수행했습니다. 데이터 세트를 8개 부분으로 나누었고 0.5일 만에 완료되었습니다. 관심을 끌기 위해 Evan의 "Sequential_Expr_Opt" 버전도 나중에 시도해 보았으며 데이터 세트를 완료하는 데 1.5~4일이 걸렸습니다(목요일 아침에 시작하여 금요일 오후가 아니라 월요일 아침에 완료됨).
이 스레드는 일반적으로 배후에 뭔가 문제가 있음을 보여주기 위한 것이었습니다. 과거에는 JMP의 병렬 성능이 좋지 않은 것을 가끔 발견하여 괴로웠습니다. 저는 JMP를 좋아하고 다른 사람들이 JMP로는 할 수 없다고 말하는 일을 JMP로 시도하는 것을 좋아합니다. 그리고 개발자들이 이를 연구하고 있다는 사실이 매우 기쁩니다.
하지만 정말 큰 데이터 세트를 처리하는 데에는 JMP보다 더 나은 도구가 있다고 말씀드리고 싶습니다. 적어도 지금은요. 
Re: 특정 장치에서 Parallel Assign()이 느립니다.안녕 @롭 , 두 가지 생각:
속도를 위한 프로그래밍
코드의 목표는 코드 작성 방법에 큰 영향을 미칠 수 있습니다.대부분의 스크립트의 경우 함수를 호출하거나 기호를 복사하는 데 걸리는 추가 시간은 중요하지 않습니다. 따라서 함수를 사용하고 코드를 해석하기 쉽게 만들어야 합니다.반면에 규모가 크고 시간이 얼마나 걸릴지 걱정할 만큼 충분히 반복되는 프로젝트를 작업하고 있다면 원시 성능을 위해 몇 가지 세부 사항을 교환하기 시작할 수도 있습니다.하지만 실제로 중요한 일을 최적화하는 데에만 시간을 투자하는 것이 좋습니다.지금 무언가를 코딩하는 데 추가 시간을 소비하지 말고 1년 후에 무엇을 했는지 파악하는 데 추가 시간을 보내야 합니다. 속도를 높이려고 더 복잡하게 만들었기 때문입니다. 단지 사용자가 하루에 한 번 추가로 20초를 절약할 수 있기 때문입니다. .
병렬 트레이드 오프
병렬로 실행할지 여부를 결정할 때 해당 '하위' 스레드를 설정하는 오버헤드와 수행할 작업의 균형을 맞춰야 합니다.JMP의 또 다른 복사본을 열고, 데이터 테이블을 열고, 실행을 클릭하여 병렬 작업을 실행한다고 상상해 보십시오. 한 시간 동안 실행하면 좋습니다. 하나의 스크립트로 모든 작업을 수행하는 것보다 많은 시간을 절약할 수 있습니다. 그러나 해당 스크립트가 20초 동안 실행되면 시작하는 데 더 많은 시간이 소요되어 저장한 것입니다.예, 여기서 오버헤드는 훨씬 작지만 기호를 복사하고 메모리를 할당하는 데는 시간이 걸립니다.환경이 설정된 후 스크립트가 수행할 작업이 상당한지 확인하십시오.이를 수행하는 데 도움이 되는 한 가지 방법은 루프를 4개의 부분으로 나누고 각 스레드가 한 번에 값의 4분의 1에 대해 작업하도록 하는 것입니다.따라서 목록을 각각 행의 1/4로 구성된 네 부분으로 나눈 다음 스크립트가 각 하위 목록을 순차적으로 처리하도록 하십시오. 이렇게 하면 하위 스레드를 설정하는 데 소요되는 시간을 n row() 번에서 4번으로 줄일 수 있습니다.
Re: 특정 장치에서 Parallel Assign()이 느립니다.저는 Craige의 조언에 따라 2주 전에 기술 지원팀에 연락했습니다. 내 PC에 대해 몇 가지 질문을 한 후 오늘 개발자들이 향후 JMP 버전의 동작을 조사하고 문제를 해결하기 위해 참여했다는 응답을 받았습니다.
그럼에도 불구하고 이 특정 스크립트의 속도를 높여준 Evan에게 다시 한 번 감사드립니다.
Re: 특정 장치에서 Parallel Assign()이 느립니다.아, 와 고마워요! 최신 워크스테이션에서 스크립트를 실행해 보세요.
병렬: 37.0833333333139
순차: 19.7166666666453
Parallel_Expr: 6.93333333331975
Sequential_Expr: 12.5333333333256
Sequential_Expr_Opt: 4.54999999998836
Sequential_Expr_Opt는 불공평한 비교이므로 고려하지 않겠습니다. 
방금 함수를 표현식으로 대체했는데 순차 버전의 경우 약 1.5배, 병렬 버전의 경우 5배(!!!) 이상의 속도 향상을 얻었습니다. 훌륭한 해결 방법입니다. 그래서 나는 이것으로부터 무엇을 배울 수 있습니까? JSL에서 함수를 사용하지 않으시나요? 함수를 사용하면 코드를 더 읽기 쉽고, 더 쉽고 안전하게 사용하고 수정할 수 있기 때문에 이는 다소 불쾌한 일입니다. 그러나 내 원래 병렬 버전은 여전히 원래 순차 버전보다 두 배의 시간이 걸리고 Craige의 가상 머신에서는 그렇지 않기 때문에 배후 어딘가에 여전히 문제가 있다고 생각합니다.
업데이트: 새 워크스테이션에 대한 전체 검사는 다음과 같습니다.


Re: 특정 장치에서 Parallel Assign()이 느립니다.내 3.6GHz 4코어 머신과 N=100k의 경우:
병렬 코드를 사용하면 순차(12.8초 병렬 대 17.8초 순차) 속도가 1.4배 향상됩니다. 이는 Craige가 본 2.7X 속도 향상만큼 좋지는 않지만 워크스테이션에서 본 속도 저하 동작보다는 낫습니다. 하지만 이로부터 좀 더 성능을 얻을 수 있는지 확인하고 싶어서 몇 가지 편집을 했습니다.
대신 표현식을 사용하여 함수 호출 오버헤드(행렬 인수 복사 등)를 제거했습니다. 이로 인해 속도가 최대 2.5배 향상되었으며(병렬 4.5초 대 순차 11.3초) 원본보다 약간 더 빨라졌습니다. 그리고 마지막으로 루프를 약간 재배열하여 순차 버전을 4초로 줄였습니다. 이는 병렬 버전보다 빠르지만 병렬 할당을 사용하면 재배열이 쉽지 않습니다. 나는 몇 가지 다른 N을 테스트했고 이러한 패턴은 유지되는 것처럼 보였지만 위의 표와 같이 전체 스윕을 수행하지는 않았습니다. 첨부된 코드를 찾으세요.
병렬: 12.78
순차: 17.80
Parallel_Expr: 4.50
Sequential_Expr: 11.27
Sequential_Expr_Opt: 3.98
Re: 특정 장치에서 Parallel Assign()이 느립니다.또한 새 워크스테이션에서 JMP에 사용할 수 있는 작업 관리자의 코어 수를 2, 4, 8개로 제한했습니다. 병렬 버전은 여전히 순차 버전보다 느립니다. 내 생각엔 JMP가 새로운 하드웨어 아키텍처에서 제대로 작동하지 않는 오래된 라이브러리를 백그라운드에서 사용하고 있는 것 같습니다.
Craige에게 감사드립니다. 기술 지원팀에 문의하겠습니다.
Re: 특정 장치에서 Parallel Assign()이 느립니다.확실하지 않다. 저는 이 스레드에 대한 메모를 JMP에 보냈습니다. 기술 지원팀에 문의하고 싶을 수도 있습니다.
내 생각엔(그리고 그게 전부입니다!) JMP가 새 하드웨어에서 성능을 다시 얻으려면 뭔가를 변경해야 할 것 같습니다. 가상 CPU가 4개만 있으면 여러분이 보는 것과 같은 것을 볼 수 없습니다.
Re: 특정 장치에서 Parallel Assign()이 느립니다.내 노트북(Win 10, JMP 16.1)에서 해당 동작을 확인할 수 있습니다.
시간_병렬 = 158.7;
시간순차 = 157.766666666667;
n=1000000
Re: 특정 장치에서 Parallel Assign()이 느립니다.안녕하세요 크레이지,
저는 지금 성능이 가장 낮은 워크스테이션을 보고 있습니다(아래). 작업 관리자에서 의심스러운 항목을 발견하지 못했습니다. CPU 외에는 완전 점유에 가까운 것은 없습니다.
또한 제가 주목한 점은 JMP 15.2.1이 병렬 버전과 순차 버전에서 항상 더 빠르다는 것입니다. n=100,000인 경우 JMP 16.1은 약 36초/18초(병렬/순차)를 사용하고 JMP 15.2.1은 31초/15초를 사용합니다. 이는 약간 더 좋지만 여전히 좋은 병렬 성능과는 거리가 멀습니다. 불행히도 더 이상 사용할 수 있는 이전 버전이 없습니다. 저는 JMP 12를 사용하여 이 코드를 작성했지만 그 당시에는 성능 문제를 발견하지 못했습니다(그리고 제가 사용하고 있던 PC도 달랐습니다).
롭

Re: 특정 장치에서 Parallel Assign()이 느립니다.이것은 VirtualBox 아래의 4-CPU 16GB ~3GHz 시스템 JMP16/win10입니다. 예상했던 속도 향상이 보입니다(4X는 아니지만 여전히 좋습니다.)
n_다른_ID = 100,000;
time_parallel = 13.9833333333333;
시간순차 = 37.7333333333333;
n_다른_ID = 1,000,000;
time_parallel = 141.233333333333;
시간순차 = 375.016666666667;
병렬 할당은 각 CPU에 대해 큰 행렬을 복사하지만 선형 그래프는 이러한 크기에서 페이징 문제가 있음을 시사하지 않습니다.
CPU 및 메모리(및 디스크) 사용량에 대한 Windows 작업 모니터를 살펴보고 설명이 있는지 확인하십시오. 병렬 할당에서는 100%, 순차 테스트에서는 25%를 보았습니다. 또한 더 큰 병렬 할당 중에 7GB가 사용되는 것을 보았습니다.
task managertask managertask managertask manager작업 관리자
Re: 일부 기기에서 Parallel Assign() 함수가 느리게 작동합니다안녕하세요 여러분,
정말 좋은 소식입니다! 3년 만에 제가 당시 보유하고 있던 PC 중 하나에서 JMP 19.0.4를 사용하여 5가지 병렬 벤치마크를 모두 다시 실행해 보았습니다(다시 한번 @EvanMcCorkle 님께 감사드립니다). 표현식을 사용할 때 병렬 성능이 JMP 16에 비해 크게 향상되었습니다. JMP 19는 약 5배 빠르며, 이는 두 JMP 버전 모두에서 "Sequential_Expr_Opt" 벤치마크 결과와 유사합니다. 하지만 Parallel Assign()을 사용할 때는 함수 사용을 여전히 피하는 것이 좋습니다. 성능이 조금 개선되긴 했지만 말입니다.
건배
롭
