2012-08-22 3 views
2

각 블록이 데이터의 주어진 부분 집합을 담당하면서 처리 할 데이터가 있습니다.CUDA의 여러 텍스처 참조 - 커널 시간에 사용

내 응용 프로그램의 특성상이 데이터가 텍스처 메모리에 있어야합니다. 그러나 데이터가 너무 커서 단일 텍스처 참조에 적합하지 않습니다.

정확하게 이해했다면 여러 개의 텍스처 참조를 가질 수는 있지만 텍스처 참조의 배열은 가질 수 없습니다. 나는 각 블록에서 다른 데이터 집합을 처리하기 위해 필요로하는

, 나는 ',

while(counter < 10000) { 

if(blockIdx.x == 0) 
    foo = tex2D(tex0, x, y); 

else if(blockIdx.x == 1) 
    foo = tex2D(tex1, x, y); 

... 

} 

같은 (커널) 일을 생각뿐만 아니라 볼이 나쁜되었다 또한 발산 문제가 발생하지 않을지 확실하지 않습니다. 내가 텍스처 참조 글로벌 및 스레드 민간없는 생각으로도 꽤 바로 보이지 않는다

texture<int, 2, cudaReadModeElementType> ref; 

(..) 

/* kernel code from now on */ 

if(blockIdx.x == 0) 
    ref = tex0; 

else if(blockIdx.x == 1) 
    ref = tex1; 

... 

while(counter < 10000) 
    foo = tex2D(ref, x, y) 

같은 일을

.

다른 대안이 있습니까? 고맙습니다.

+0

데이터가 실제로 다른 텍스처로 시작해야합니까? – talonmies

+0

선형 메모리에 바인딩 된 2D 텍스처의 최대 크기는 이미 mem의 4Gb 인 65000 x 65000입니다. 최대 크기 8k x 8k x 512 = 32Gb의 2D 레이어드 텍스처도 있습니다. 그래픽 카드의 전체 메모리 용량은 얼마입니까? 나는 매우 큰 텍스쳐가 거의 없다고 가정합니다. –

+0

@talonmies 크기 제한 때문에 하나의 텍스처에만 맞지 않습니다. –

답변

1

가능한 경우 텍스처 데이터를 단일 텍스처로 유지하고 하드웨어 제한 내에서 필요에 따라 좌표에 변형을 적용해야합니다.

그렇지 않으면, 예측을 통해 여러 텍스처 참조 중에서 선택할 수 있습니다. 비 술어 화 된 명령어 만 실제로 텍스처 메모리 참조를 생성합니다.

CUDA 핸드북의 tex1dfetch_big.cu 샘플은 하드웨어에서 지원하는 27 비트 인덱스를 넘어 주소 지정 기능을 향상시키기 위해이를 수행하는 방법을 보여줍니다.

https://github.com/ArchaeaSoftware/cudahandbook/blob/checkpoint/texturing/tex1dfetch_big.cu