2012-01-05 4 views
1

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

Моя конечная цель - билинейная интерполяция в pycuda из набора взвешенных случайных точек. Я никогда не программировал 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. :(

Любая помощь на это было бы здорово!

+0

Что '__global__' делать? Почему, по-вашему, вам это нужно? –

+0

@MarkRansom: Это CUDA, и это необходимо - '__global__' обозначает драйверу компилятора NVIDIA, что функция является кодом gpu. – talonmies

+0

Если вы хотите продолжить изучение CUDA на Python, попробуйте это. http://www.accelereyes.com/afpy.html –

ответ

1

Сообщение об ошибке довольно явное - ядра CUDA не могут возвращать значения, они должны быть объявлены void и модифицируемые аргументы переданы как указатели. Это имело бы больше смысла для вашей реализации лерпа быть объявлена ​​как функция устройства, как это:

__device__ float lerp(float a, float b, float w) 
{ 
    return a + w*(b-a); 
} 

, а затем вызывается из внутри ядра для каждого значения, которое требует интерполяции. У вашей функции lerp не хватает много «инфраструктуры», чтобы быть полезным ядром CUDA.


EDIT: на самом деле основное ядро ​​по той же схеме может выглядеть примерно так:

__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]); 
} 
+0

так что-то еще по этим линиям? pycuda.elementwise.ElementwiseKernel ("float a, float b, float w", "return a + b + w", "lerp") – Austinstig

+0

Нет, что все еще имеет ту же проблему - функции ядра не могут возвращать значения. Это не похоже на старомодный язык шейдеров, доступ к памяти осуществляется через указатели, переданные как аргумент функции. Похоже, вы должны прочитать какую-либо документацию или посмотреть на одно из множества вводных руководств, которые поисковая система по вашему выбору найдет для вас, если вы решите искать. – talonmies

 Смежные вопросы

  • Нет связанных вопросов^_^