Сообщение об ошибке довольно явное - ядра CUDA не могут возвращать значения, они должны быть объявлены void
, а изменяемые аргументы передаются как указатели.Было бы более целесообразно объявить вашу реализацию lerp как функцию устройства следующим образом:
__device__ float lerp(float a, float b, float w)
{
return a + w*(b-a);
}
, а затем вызывать ее из ядра для каждого значения, которое требует интерполяции.Вашей функции lerp не хватает «инфраструктуры», чтобы быть полезным ядром CUDA.
РЕДАКТИРОВАТЬ: действительно базовое ядро в том же духе может выглядеть примерно так:
__global__ void lerp_kernel(const float *a, const float *b, const float w, float *y)
{
int tid = threadIdx.x + blockIdx.x*blockDim.x; // unique thread number in the grid
y[tid] = a[tid] + w*(b[tid]-a[tid]);
}