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 부분 (접두사) 총액을 할 수