2012-08-08 8 views
0

OpenCL에서 groupby 축소를 구현하고 싶습니다. 예를 들어, 입력OpenCL에서 Groupby 감소?

a1 a2 a3 b1 b2 c3 c4 

는 C의 의사 코드는 다음과 같다

a6 b3 c7 

생성 것이다 :

int data[n][2], result[n][2], result_count = -1, 
    added = 0, group = data[0][0]; 
for (int i = 0; i < n; i++) { 
    if (group == data[i][0]) { 
    added += data[i][1]; 
    } else { 
    result[++result_count][0] = group; 
    result[result_count][1] = added; 
    group = data[i][0]; 
    added = 0; 
    } 
} 
return result, result_count; 

이 방향으로 이동 I 알고있는 유일한 표준 알고리즘은 병렬 감소이다; 그러나 하나의 숫자로 줄어들고 그룹별로 추가 된 값의 버퍼로는 줄어들지 않습니다. 병렬 감소가 동적 결과 버퍼 (예 : 로컬 메모리)에서 작동하고 성능 측면에서 여전히 효율적인지 확신 할 수 없습니다.

+0

Thrust의 [zip iterators] (http://code.google.com/p/thrust)와 비슷한 것을 시도해 보았습니까?/wiki/QuickStartGuide # zip_iterator)? 추력에는 OpenCL 지원이 없지만 CUDA 코드에서 영감을 얻을 수 있습니다. ZIP 반복기는 관심있는 것과 유사한 여러 출력 시퀀스를 허용합니다. – limes

+0

IIUC zip 반복기는 단순히 예를 들어. n-tuple 데이터 세트를 줄이면 여전히 감소하지만 하나의 n-tuple 만 생성하고 n-tuples의 배열/목록은 생성하지 않습니다. –

답변

1

1 단계 쪼개어 용액)을 해싱 기법이 위치를 상기 그룹 값을 해시 후 원자 추가 번째 값의 내용을 요약 할 수있다.

2 단계) 접두어 합계 검색 알고리즘이 해시 테이블을 통과하여 압축합니다.

단계 3) 선택적으로, 상기 결과

정렬

단계 1) 각 그룹

을 합산하는 감소를 사용하여 그룹 값

단계 2)에서 데이터를 정렬 정렬하여 용액

단계 3) 합계를 압축하는 접두어 합계 스캔