Да, вы можете сделать это с памятью текстур, и это быстро. Я лично использую 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