제 질문은 동적으로 변경되는 CUDA의 배열 요소 집합에 대한 전역 기록에 관한 것입니다. 다음 커널을 고려해해시를 사용하여 통합 된 전역 메모리 쓰기
여기__global__ void
kernel (int n, int *odata, int *idata, int *hash)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n)
odata[hash[i]] = idata[i];
}
hash
어레이의 제 n
요소 idata
의 제 n
소자로부터 갱신 할 odata
의 인덱스를 포함한다. 분명히 이것은 끔찍하고 끔찍한 유착 부족을 초래합니다. 내 코드의 경우 한 커널 호출의 해시는 다른 커널의 해시와 완전히 관련이 없으므로 (다른 커널은 다른 방식으로 데이터를 업데이트합니다.)이 특정 kenrel을 최적화하기 위해 데이터를 다시 정렬하는 것은 옵션이 아닙니다.
이 상황의 성능을 향상시킬 수있는 몇 가지 기능이 CUDA에 있습니까? 텍스처 메모리에 대해 많은 이야기를 들었지만, 읽은 것을이 문제의 해결책으로 번역 할 수 없었습니다.
답장을 보내 주셔서 감사합니다. 사실 나는 여러분이 묘사하는 상황 (전역 메모리로부터의 흩어져있는 읽기)에 정확히 맞닥뜨린 여러 곳에서 내 코드를 사용한다. 이러한 읽기는 실제로 배열에서 무작위 (일반적으로 스파 스)입니다. 이 경우 텍스쳐 메카니즘을 살펴볼 가치가 있습니까? – coastal
텍스처링이 도움이 될 수 있습니다. 텍스처링은 여전히 데이터 지역성 및 재사용에 따라 어떤 이점도 제공합니다. 흩어져있는 독서의 효과가 각 위치를 한 번만 읽는 것이라면 텍스처링이 도움이되지 않습니다. 그러나 잠재적으로 여러 위치를 한 번 이상 읽는다면 (아마 여러 스레드에서) 질감이 약간 개선 될 수 있습니다. –