2016-10-04 2 views
1

2 차원 배열이 MxN인데, N은 2의 거듭 제곱이고 M은 2의 거듭 제곱이 아닌 임의의 정수입니다. 예를 들어 배열 A의 크기는 200x32 일 수 있습니다.OpenCL 축소 - 2D 행렬을 1D 배열로

배열의 행 전체에서 축소 (추가) 연산을 수행하여 배열 A를 크기 1x32로 줄이려고합니다. 대부분의 감소는 Blelloch/Hillis 스캔 알고리즘을 사용하여 연속 요소를 추가하여 배열을 단일 값으로 줄입니다. 내 경우에는 연속 요소가 관련이 없으므로 추가 할 수 없습니다. 그러나 요소 [1, 33, 65 ...]와 요소 [2,34,66 ..] 등을 추가해야합니다.

이것은 병합 액세스가 아니기 때문에이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변

2

그것은이 병합되어

WorkItem1 -> 1 + 33 + 65 + ... 
WorkItem2 -> 2 + 34 + 66 + ... 
WorkItem3 -> 3 + 35 + 67 + ... 
... 

당신이 스레드 그룹의 연속적인 메모리 위치에있는 모든 메모리 작업을 볼 수 있듯이.

또한 최적화를 위해 벡터 작업을 시도해 볼 수는 있지만 컴파일러가 이미 최적화되어 있다고 생각합니다.

+0

나는 이것을 배우면서 올바르게 이해하고 있는지 확신 할 수 없다. 메모리 위치 1, 33, 65는 연속적으로 메모리에 배치되지 않습니다. 이 통합 된 액세스는 어떻게됩니까? – OCL

+2

Coalesced 액세스는 모든 메모리 액세스가 연속적 일 때마다 시계의 "t"가 올 때입니다. 작업 항목 1이 실행 및 종료되지 않고 작업 항목 2가 시작되는 식으로 계속됩니다. 대신, 모두 동시에 실행됩니다. 그리고 필요한 메모리는 t1 -> [1,32], t2 -> [33,64], ... 등등입니다. – DarkZeros

관련 문제