Да, можете да направите това с текстурна памет и е бързо. Аз лично използвам 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