내가 [45,21,764,234,7,0,12,55,...]
CUDA
그럼 난으로 배열 A
에 지역의 위치를 나타냅니다 다른 배열 B[4000]
이 모두 다른 숫자가 포함 된 값의 배열 A[4000]
을 말해봐 지역의 일부인 경우 1
, 그렇지 않은 경우 0
입니다. 1's
이 서로 인접 해 동일한 지역에 속해 있다는 것을 의미합니다. 서로 인접하지 않으면 (사이에 0
이 있음) 서로 다른 지역의 일부입니다.
ex. B = [1,1,1,0,1,1,0,0...]
내가 first three numbers in array A
의 영역에서 최대 값을 찾고, 5th and 6th numbers in array A, etc.
의 최대 값을 찾으려면 B
으로 표시된 각 영역에서 최대 값이 A
인 배열 C[4000]
을 생성 할 수 있다는 것을 의미합니다. 지역의 일부가 아닌 영역에 0
.
그래서이 경우 C = [764,764,764,0,7,7,0,0...]
는 0 to 2,000 regions
어디서나있을 수 있고, 지역의 길이는 2 to 4,000 numbers long
에 이르기까지 다양 할 수 있습니다. 얼마나 많은 지역이 있는지 또는 지역의 크기가 다른지 미리 알 수 없습니다.
나는이 결과를 얻을 수있는 CUDA 커널을 만들려고 노력해 왔습니다. 실제로는 이미지에 사용되므로 가능한 한 빨리 처리해야합니다. 이는 단순한 예입니다. 축소를 사용하는 것과 같은 나의 모든 아이디어는 하나의 영역 만있는 경우에만 4000
배열 번호가 모두 A
인 경우에만 작동합니다. 그러나 배열에서 여러 지역이 1
에서 3996
공백 (0's
)으로 분리되어 있기 때문에 여기에서 감산을 사용할 수 있다고 생각하지 않습니다. 축소하면 분리 된 지역의 느슨한 궤도가 나을 것입니다. 또는, 커널은 너무 많은 루프를 가지고 있으며, 거기에 문이 분명히 코드도 공유 메모리와 느린, 정말 CUDA의 병렬 특성을 활용하지 않는 빠른 같은
int intR = 0;
while(B[blockIdx.x * blockDim.x + threadIdx.x + intR] > 0){
intMaxR = intMaxR < A[blockIdx.x * blockDim.x + threadIdx.x + intR] ? A[blockIdx.x * blockDim.x + threadIdx.x + intR] : intMaxR;
intR++;
}
int intL = 0;
while(B[blockIdx.x * blockDim.x + threadIdx.x - intL] > 0){
intMaxL = intMaxL < A[blockIdx.x * blockDim.x + threadIdx.x - intL] ? A[blockIdx.x * blockDim.x + threadIdx.x + intL] : intMaxL;
intL++;
}
intMax = intMaxR > intMaxL ? intMaxR : intMaxL;
for(int i = 0; i < intR; i++){
C[blockIdx.x * blockDim.x + threadIdx.x + i] = intMax;
}
for(int i = 0; i < intL; i++){
C[blockIdx.x * blockDim.x + threadIdx.x - i] = intMax;
}
로 할 수있는 경우. CUDA에서 이것이 어떻게 효율적으로 수행 될 수 있는지에 대한 아이디어가 있습니까?
미리 감사드립니다.
[추력] (https://github.com/thrust/thrust/wiki/Quick-Start-Guide) 함수 [reduce_by_key] (http://thrust.github.io/doc)를 사용할 수 있습니다. /group__reductions.html#ga1fd25c0e5e4cc0a6ab0dcb1f7f13a2ad) 도움을 받으십시오. –
그 지역의 최대 값을 찾는 데 도움이되지만 여전히 위치를 잃지 않거나 전체 배열을 반복하여 영역이 매우 평행하지 않은 곳을 채우기 위해 반복해야합니다. – user2719805
예, 그렇지 않았습니다. 완전한 해결책이라고 제안했다. 나는 그것이 어떻게 완전한 해결책으로 사용될 수 있는지 보여주는 해답을 추가했다. –