알려진 수의 스레드를 병렬 처리 (위대한)해야하지만 각 스레드의 내부 반복 수가 크게 다를 수있는 문제가 있습니다. . 내 마음 속에서, 이것은 더 나은이 같은 커널 방식을 할 수 있습니다 : 반드시 FULL 가능한 위해 실행됩니다OpenCL - 벡터화 vs 스레드 내 루프
__kernel something(whatever)
{
unsigned int glIDx = get_global_id(0);
unsigned int glIDy = get_global_id(1); // max "unroll dimension"
if(glIDy_meets_condition)
do_something();
else
dont_do_anything();
}
:보다는 ID가 (0) 사전에 알려져있다
__kernel something(whatever)
{
unsigned int glIDx = get_global_id(0);
for(condition_from_whatever)
{
}//alternatively, do while
}
,
나에 대한 특정 정보를 찾을 수 없습니다 : 등이 논의에 따라, 사전에 종료 할 수있는 방법으로 glIDy의 범위, 커널 내에서 동적 크기의 forloops/do-while 문에 대한 비용은 Nvidia 및 AMD SDK의 커널에서 어디에서나 볼 수 있습니다. 커널 내부 조건 분기가 비 주기적 일수록 성능이 어떻게 떨어지는지를 읽었던 것을 기억합니다.
실제 질문 : 제가 제안 제 1 방식보다 GPU 아키텍처에 대처하기 위해보다 효율적인 방법이
있습니까?
이 주제에 대한 일반 정보는 공개되어 있습니다.
감사합니다.
x 차원이 충분한 병렬 처리를 제공한다고 가정하면 가변 크기 차원에 대한 루핑 방법이 좋을 것입니다. 전반적인 커널 시간은 가장 긴 실행 루프에 의해 결정됩니다. 충분한 스레드를 생성 할 수 있거나 빠른 스레드 그룹에서 해제 된 자원을 사용하여 시작할 수있는 다른 동시 커널이있는 경우이 방법이 유용 할 수 있습니다. –