2017-11-22 16 views
1

1D 데이터 집합이 여러 개의 세그먼트로 나누어지며 각 작업 항목은 하나의 세그먼트를 처리합니다. 세그먼트에서 개의 요소을 읽었습니까? 요소의 수는 미리 알려지지 않았으며 각 세그먼트마다 다릅니다.OpenCL에서 부분 합계 계산

모든 세그먼트들이 처리 된 후

+----+----+----+----+----+----+----+----+----+  <-- segments 
    A BCD E FG HIJK L M  N  <-- elements in this segment 

그들이 elements 연속적출력 메모리 쓰기한다 그래서

A B C D E F G H I J K L M N 

하나의 요소의 절대 출력 위치 등 세그먼트는 이전 세그먼트의 요소 수에 따라 다릅니다. 세그먼트가 1 개의 요소 (A)를 포함하고 세그먼트 2가 3 개의 요소를 포함하기 때문에 E은 위치 4에 있습니다.


오픈 CL 커널은 로컬/공유 메모리 버퍼로의 각 세그먼트에 대한 요소의 수를 기록하고

kernel void k(
    constant uchar* input, 
    global int* output, 
    local int* segment_element_counts 
) { 
    int segment = get_local_id(0); 
    int count = count_elements(&input[segment * segment_size]); 

    segment_element_counts[segment] = count; 

    barrier(CLK_LOCAL_MEM_FENCE); 

    ptrdiff_t position = 0; 
    for(int previous_segment = 0; previous_segment < segment; ++previous_segment) 
     position += segment_element_counts[previous_segment]; 

    global int* output_ptr = &output[position]; 
    read_elements(&input[segment * segment_size], output_ptr); 
} 

그래서 각 작업 항목이 부분 합을 계산하는 이러한 (의사)처럼 작동 큰 ID를 가진 작업 항목이 반복을 많이하는 루프를 사용한다.

OpenCL 1.2에서이 작업을 구현하는보다 효율적인 방법 (각 작업 항목은 시퀀스의 부분 합계, 인덱스까지 계산)이 있습니까? OpenCL 2는 이것을 위해 work_group_scan_inclusive_add을 제공하는 것 같습니다. 이런 당신은 LOG2에 N 부분 (접두사) 총액을 할 수

답변