Интерполяция с памятью текстур CUDA

Я хотел бы использовать память текстур для интерполяции данных. У меня есть 2 массива (а именно A[i] и B[i]), и я хотел бы интерполировать данные между ними. Я думал, что смогу связать их с памятью текстур и установить интерполяцию, но я не уверен, как я могу это сделать.

В примерах, поставляемых с 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;

Вышеприведенное предполагает, что вы хотите интерполировать между соответствующими индексами двух разных массивов или матриц. Также доступны другие функции интерполяции.

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