2012-01-05 4 views
1

저는 pyCUDA에 막 들어간 레크리에이션 파이썬 스타입니다. pyCUDA를 사용하여 선형 보간 (lerp)을 구현하는 방법을 알아 내려고 노력 중입니다. CUDA CG 함수는 다음과 같습니다. http://http.developer.nvidia.com/Cg/lerp.htmlpycuda (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 on Python을 더 자세히 살펴 보려면이 중 하나를 사용해보십시오. http://www.accelereyes.com/afpy.html –

답변

1

오류 메시지는 매우 명백합니다. 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]); 
} 
+0

이렇게,이 라인을 따라 더 많은 것이 있습니까? – Austinstig

+0

여전히 동일한 문제가 있습니다. 커널 함수는 값을 반환 할 수 없습니다. 이것은 구식 셰이더 언어와 같지 않습니다. 메모리 액세스는 함수 인수로 전달 된 포인터를 통해 수행됩니다. 몇 가지 문서를 읽거나 검색을 선택하면 선택한 검색 엔진이 찾을 수있는 방대한 수의 입문 자습서 중 하나를 봐야합니다. – talonmies