Линейная интерполяция с использованием pycuda (lerp) - PullRequest
1 голос
/ 06 января 2012

Я развлекательный питонист, который только что попал в pyCUDA. Я пытаюсь выяснить, как реализовать линейную интерполяцию (lerp) с помощью pyCUDA. Функция CUDA CG: http://http.developer.nvidia.com/Cg/lerp.html

Моя конечная цель - билинейная интерполяция в пикуде из набора взвешенных случайных точек. Я никогда не программировал C или CUDA в этом отношении, и я учусь на ходу.

Вот как далеко я продвинулась:

import pycuda.autoinit
import pycuda.driver as drv
import pycuda.compiler as comp

lerpFunction = """__global__ float lerp(float a, float b, float w)
{
    return a + w*(b-a);
}"""

mod = comp.SourceModule(lerpFunction) # This returns an error telling me a global must return a void. :(

Любая помощь в этом была бы фантастической!

1 Ответ

1 голос
/ 06 января 2012

Сообщение об ошибке довольно явное - ядра 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]);
}
...