2012-08-22 3 views
1

데이터 보간을 위해 텍스처 메모리를 사용하고 싶습니다. 나는 2 개의 배열 (즉, A [i]와 B [i])을 가지고 있으며 그들 사이에 데이터를 삽입하려고합니다. 텍스쳐 메모리에 바인딩하고 보간을 설정할 수 있다고 생각했지만 어떻게 할 수 있을지 확신하지 못했습니다.CUDA로 보간 텍스처 메모리

CUDA와 함께 제공되는 예제에서는 A [i-1] 및 A [i + 1]을 사용하여 보간합니다.

내가 계획 한 것을 수행 할 방법이 있습니까? 나는 내가 좋은 스피드 업을 얻을 수 있다고 생각하기 때문에 이것을 시도하고있다.

답변

2

네, 텍스처 메모리로이를 수행 할 수 있으며 속도가 빠릅니다. 나는 수동으로 코드를 작성하는 것보다 더 빠르기 때문에 개인적으로 ArrayFire을 사용하여 이러한 종류의 작업을 수행합니다. 그냥 플러그인 내 경험에서 내가 시도하는 것보다 빠릅니다 ArrayFire (원하는 경우

// outside kernel 

texture<float,1>  A; 
cudaChannelFormatDesc desc = cudaCreateChannelDesc<float>(); 
cudaArray *arr = NULL; 
cudaError_t e = cudaMallocArray(&arr, &desc, 1, length); 
A.filterMode = cudaFilterModePoint; 
A.addressMode[0] = cudaAddressModeClamp; 
cudaBindTextureToArray(A, arr, desc); 

... 

// inside kernel 
    
valA = tex1D(A,1,idx) 
valB = tex1D(B,1,idx) 

float f = 0.5; 
output  = (f)*valA + (1-f)*valB; 

:

당신이 CUDA에 자신을 손으로 코딩 할 경우이 같은 당신이 원하는 무엇인가 코드를 손으로) 사용하는 방법은 간단 말할 것도없고, 당신은 할 수 있습니다 :

// in arrayfire 
array A = randu(10,1); 
array B = randu(10,1); 
float f = 0.5; 
array C = (f)*A + (1-f)*B; 

을 위는 2 개 개의 다른 배열이나 행렬의 해당 인덱스 보간 할 가정합니다. 사용 가능한 other interpolation functions도 있습니다.

+0

tex1D는 두 개의 인수 만 필요합니다. – Silve2611

2

CUDA로 개발하는 데 익숙하지 않은 경우 텍스처 메모리를 사용하는 것이 가장 쉬운 방법은 아닙니다.

알고리즘의 첫 번째 병렬 버전을 최적화하지 않고 CUDA로 작성해보십시오. 그런 다음 응용 프로그램에서 NVIDIA 비주얼 프로파일 러을 사용하여 메모리 액세스를 최적화하기 위해 텍스처 메모리를 설정해야하는지 확인하십시오.

이전에 사용자가 을 최적화하면 더 편리하게 디버그하는 것이임을 기억하십시오.

는 (아직 릴리스 후보에서 CUDA 5) 마지막으로, 최신 CUDA 버전은 const restrict으로 커널에 매개 변수로 전달 된 입력 버퍼를 선언 자동으로 한 텍스처 메모리에 데이터를 저장 할 수 있습니다 포인터.

+0

대답은 Thx입니다. 이미 첫 번째 병렬 버전이 있습니다. 그러나 CPU에 비해 ​​속도면에서는 그리 인상적이지 않습니다. 그래서 이것을 시도하고 싶습니다. – Silve2611

+0

먼저 프로파일 러를 실행하십시오. 문제는 메모리 액세스가 아닌 다른 것일 수 있습니다. – jopasserat

+0

문제가있는 것은 아닙니다. 나는 그 결과를 비교하기를 원할 것입니다. 그래서 어떻게하는지 알면 도움이 될 것입니다. – Silve2611