Интерполация с CUDA Texture памет

Бих искал да използвам Texture Memory за интерполация на данни. Имам 2 масива (а именно A[i] и B[i]) и бих искал да интерполирам данни между тях. Мислех, че мога да ги свържа с Texture Memory и да задам интерполацията, но не съм сигурен как мога да направя това.

Примерите, които идват с CUDA, използват A[i-1] и A[i+1] за интерполация.

Има ли някакъв начин да направя това, което планирах? Опитвам това, защото мисля, че мога да постигна добро ускорение.


person Silve2611    schedule 22.08.2012    source източник


Отговори (2)


Да, можете да направите това с текстурна памет и е бързо. Аз лично използвам ArrayFire за изпълнение на тези видове операции, защото е по-бързо, отколкото мога да се надявам да кодирам на ръка.

Ако искате сами да кодирате на ръка в CUDA, нещо подобно е това, което искате:

// 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;

Ако искате просто да включите ArrayFire (което според моя опит е по-бързо от това, което се опитвам да кодирам на ръка, да не говорим, че е много по-лесно за използване), тогава ще искате:

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

Горното предполага, че искате да интерполирате между съответните индекси на 2 различни масива или матрици. Налични са и други функции за интерполация.

person Ben Stewart    schedule 22.08.2012

Ако не сте свикнали да разработвате с CUDA, използването на текстурна памет не е най-лесното нещо, с което да започнете.

Предлагам ви да опитате да напишете първа паралелна версия на вашия алгоритъм в CUDA без оптимизация. След това използвайте NVIDIA Visual Profiler на вашето приложение, за да разберете дали трябва да настроите памет за текстури, за да оптимизирате достъпа до паметта си.

Не забравяйте, че колкото по-рано оптимизирате, толкова по-трудно е отстраняването на грешки.

Не на последно място, най-новата версия на CUDA (CUDA 5, все още е кандидат за версия) е в състояние да автоматично съхранява вашите данни в текстурна памет, стига да декларирате входните буфери, предадени като параметри на вашето ядро ​​като const restrict указатели.

person jopasserat    schedule 22.08.2012
comment
Благодаря за отговора. Вече имам първа паралелна версия. Но ускорението в сравнение с процесор не е много впечатляващо. Ето защо бих искал да изпробвам това. - person Silve2611; 22.08.2012
comment
Първо стартирайте профайлъра. Вашият проблем може да е всичко друго, но не и достъп до паметта. - person jopasserat; 22.08.2012
comment
Не че имам проблем. Просто бих искал да сравня резултата, така че би било полезно, ако знам как да направя това. - person Silve2611; 22.08.2012