그래서 시뮬레이션을 위해 격자에 키네틱 몬테 카를로 (Kinetic Monte Carlo)를 사용하는 코드가 있습니다. 나는 내 GPU에서이 코드를 실행하기 위해 CUDA를 사용하고있다. (같은 질문이 OpenCl에도 적용된다고 생각하지만).분기 발산, CUDA 및 키네틱 몬테카를로
이것은 내 격자를 작은 하위 격자로 나눕니다. 각 스레드는 그 중 하나에서 작동합니다.
While(condition == true){
*Grab a sample u from U[0,1]*
for(i = 0; i < 100;i++){
*Do some stuff here to generate A*
if(A > u){
*Do more stuff here, which could include updates to global memory*
break();
}
}
}
A가 다른 스레드에 대한 다른 그래서 U를하고 (100)는 임의의 숫자입니다 : 내가 KMC를하고있는 중이 야하기 때문에, 각 스레드는이 코드를 가지고있다. 코드에서이 값은 1000 또는 10000 일 수 있습니다.
그래서 스레드가 통과 할 때 분기가 발생하지 않습니까? 이것이 성능에 얼마나 나쁜 영향을 줄 수 있습니까? 대답은 if 절 안에있는 코드에 따라 다르지만 더 많은 스레드를 추가 할 때이 배율은 어떻게 될까요?
성능 손실/손실을 예측할 수있는 방법에 대한 언급도 환영합니다.
감사합니다.
다른 스레드가 루프 반복 수 (100/1000/10000 인용)가 다를 수 있습니까? –
@Brendan Wood : 아니요, 모두 동일하지만 if 블록에 스레드가 들어가 자마자 그 스레드는 i의 값에 관계없이 루프에서 빠져 나옵니다. 아, 그러면 해당 스레드가 처음부터 다시 시작됩니다. 아마도이를 반영하기 위해 코드 샘플을 편집해야합니다. – Konstantinos