2017-12-12 10 views
1

다음과 같은 코드는 작동하지 않습니다. 이유를 이해하고 싶습니다. 내가 가진파이 쿠다 코드가 작동하지 않습니다. 함수 호출에서 "블록"줄이 작동하지 않습니다.

오류가 있습니다 : "형식 오류 : 매개 변수 # 3에 유효하지 않은 유형 (0 기반)"

그리고 오류가 함수 내 전화의 블록 라인에서 발생합니다. 코드에서 따라서 끝까지 두 줄로 block = (MATRIX_SIZE,MATRIX_SIZE,1) 줄입니다.

여기에 실수가 무엇인지 아는 사람이 있습니까? 나는 많은 것을 시도했지만 알아 내지 못합니다.

쿠다 코드는 C++에서 일하고, 난 그냥 지금 PyCuda에서 번역하려고하고 오류의 원인의

import numpy as np 
from pycuda import driver, compiler, gpuarray, tools 

# -- initialize the device 
import pycuda.autoinit 

kernel_code_template = """ 
__global__ void MatMult(float* C, float* A, float*B, int dimAx, int dimBx, int dimCx, int dimCy) 
{ 
    int row = blockDim.y*blockIdx.y+threadIdx.y; 
    int col = blockDim.x*blockIdx.x+threadIdx.x; 

    double Result = 0; 

    if (row<=dimCy-1 && col<=dimCx-1) 
    { 
     for (int k = 0; k < dimAx; k++) 
     { 
      Result += A[k + dimAx*row] * B[col + dimBx*k]; 
     } 

     C[col + row*dimCx] = Result; 
    } 
} 
""" 

MATRIX_SIZE=3 

# I create my variables : 
a_cpu=np.asarray([[0,1,2],[10,11,12],[20,21,22]]) 
b_cpu=np.asarray([[0,0,0],[1,2,3],[4,8,12]]) 

a_gpu = gpuarray.to_gpu(a_cpu) 
b_gpu = gpuarray.to_gpu(b_cpu) 

size_Ax=a_cpu.shape[1] 
size_Bx=b_cpu.shape[1] 

size_Ay=a_cpu.shape[0] 

size_Cx=size_Bx # Cx=Bx because of matrix product 
size_Cy=size_Ay # Cy=Ay 
# create empty gpu array for the result (C = A * B) 
c_gpu = gpuarray.empty((size_Cy, size_Cx), np.float32) 

# get the kernel code from the template 
kernel_code=kernel_code_template 
# compile the kernel code 
mod = compiler.SourceModule(kernel_code) 

# get the kernel function from the compiled module 
matrixmul = mod.get_function("MatMult") 

# call the kernel on the card 

matrixmul(
    # outputs 
    c_gpu, 
    # inputs 
    a_gpu, b_gpu, 
    size_Ax,size_Bx,size_Cx,size_Cy, 
    # (only one) block of MATRIX_SIZE x MATRIX_SIZE threads 
    block = (MATRIX_SIZE,MATRIX_SIZE,1), 
    ) 
+0

어떤 줄에서 오류가 발생합니까? –

+0

@ TomášPospíšek 그것은 블록 라인에 있으며, 마지막 두 줄 앞에 있습니다 : "block = (MATRIX_SIZE, MATRIX_SIZE, 1)" – StarBucK

답변

1

귀하의 해석이 잘못 실패 곳입니다. 오류 메시지 :

"TypeError: invalid type on parameter #3 (0-based)"

네 번째 매개 변수 size_Ax 잘못된 유형이 있음을 말하고있다. 오류는 블록 인수와 다릅니다.

이 이유는 PyCUDA가 GPU와 데이터를주고받을 때 엄격한 유형 안전을 강요하기 때문입니다. 커널 서명에 dimAx, dimBx, dimCxdimCy의 값은 int이어야하며 32 비트입니다. 파이썬 정수는 기본적으로 64 비트입니다.

matrixmul(
    # outputs 
    c_gpu, 
    # inputs 
    a_gpu, b_gpu, 
    np.int32(size_Ax),np.int32(size_Bx),np.int32(size_Cx),np.in32(size_Cy), 
    # (only one) block of MATRIX_SIZE x MATRIX_SIZE threads 
    block = (MATRIX_SIZE,MATRIX_SIZE,1), 
    ) 

가 제대로 작동합니다 : 당신은 명시 적으로 무언가 같이, 올바른 ctype에 인수를 캐스팅해야합니다.