2012-09-01 9 views
-2

이것은 rotation.I에 대한 나의 pycuda 코드이며 최신 cuda 드라이버를 설치했으며 cuda 지원과 함께 nvidia gpu를 사용합니다. 또한 cuda 툴킷과 pycuda 드라이버를 설치했습니다.이 이상한 오류가 발생했습니다.실행 중 PyCuda 오류

import pycuda.driver as cuda 
import pycuda.compiler 
import pycuda.autoinit 
import numpy 
from math import pi,cos,sin 

_rotation_kernel_source = """ 
texture<float, 2> tex; 

__global__ void copy_texture_kernel(
    const float resize_val, 
    const float alpha, 
    unsigned short oldiw, unsigned short oldih, 
    unsigned short newiw, unsigned short newih, 
    unsigned char* data) { 

     unsigned int x = blockIdx.x * blockDim.x + threadIdx.x; 
     unsigned int y = blockIdx.y * blockDim.y + threadIdx.y; 

     if((x >= newiw) || (y >= newih)) 
      return; 

     unsigned int didx = y * newiw + x; 

     float xmiddle = (x-newiw/2.)/resize_val; 
     float ymiddle = (y-newih/2.)/resize_val; 
     float sx = (xmiddle*cos(alpha)+ymiddle*sin(alpha) + oldiw/2.) ; 
     float sy = (-xmiddle*sin(alpha)+ymiddle*cos(alpha) + oldih/2.); 

     if((sx < 0) || (sx >= oldiw) || (sy < 0) || (sy >= oldih)) { 
      data[didx] = 255; 
      return; 
     } 

     data[didx] = tex2D(tex, sx, sy); 
    } 
""" 
mod_copy_texture=pycuda.compiler.SourceModule(_rotation_kernel_source) 

copy_texture_func = mod_copy_texture.get_function("copy_texture_kernel") 
texref = mod_copy_texture.get_texref("tex") 

def rotate_image(a, resize = 1.5, angle = 20., interpolation = "linear", blocks = (16,16,1) ): 


    angle = angle/180. *pi 


    a = a.astype("float32") 

    calc_x = lambda (x,y): (x*a.shape[1]/2.*cos(angle)-y*a.shape[0]/2.*sin(angle)) 
    calc_y = lambda (x,y): (x*a.shape[1]/2.*sin(angle)+y*a.shape[0]/2.*cos(angle)) 

    xs = [ calc_x(p) for p in [ (-1.,-1.),(1.,-1.),(1.,1.),(-1.,1.) ] ] 
    ys = [ calc_y(p) for p in [ (-1.,-1.),(1.,-1.),(1.,1.),(-1.,1.) ] ] 

    new_image_dim = (
     int(numpy.ceil(max(ys)-min(ys))*resize), 
     int(numpy.ceil(max(xs)-min(xs))*resize), 
    ) 


    cuda.matrix_to_texref(a, texref, order="C") 


    if interpolation == "linear": 
     texref.set_filter_mode(cuda.filter_mode.LINEAR) 


    gridx = new_image_dim[0]/blocks[0] if \ 
      new_image_dim[0]%blocks[0]==1 else new_image_dim[0]/blocks[0] +1 
    gridy = new_image_dim[1]/blocks[1] if \ 
      new_image_dim[1]%blocks[1]==0 else new_image_dim[1]/blocks[1] +1 

    output = numpy.zeros(new_image_dim,dtype="uint8") 

    copy_texture_func(
     numpy.float32(resize), numpy.float32(angle), 
     numpy.uint16(a.shape[1]), numpy.uint16(a.shape[0]), 
     numpy.uint16(new_image_dim[1]), numpy.uint16(new_image_dim[0]), 
      cuda.Out(output),texrefs=[texref],block=blocks,grid=(gridx,gridy)) 

    return output 

if __name__ == '__main__': 
    import Image 
    import sys 

    def main(): 
     if len(sys.argv) != 2: 
      print "You should really read the source...\n\nUsage: rotate.py <Imagename>\n" 
      sys.exit(-1) 

     img = Image.open(sys.argv[1]).convert("L") 
     i = numpy.fromstring(img.tostring(),dtype="uint8").reshape(img.size[1],img.size[0]) 

     irot = rotate_image(i) 
     rotimg = Image.fromarray(irot,mode="L") 

     rotimg.save("rotated.png") 
     rotimg.show() 

    main() 

이것은 내 오류입니다.

ImportError: libboost_python-gcc43-mt-1_39.so.1.39.0: cannot open 
    shared object file: No such file or directory 

제발 도와주세요.

+0

이것은 아주 자명 한 오류입니다. boost.python을 설치하지 않았거나 실행중인 python 인스턴스에서 찾을 수없는 장소에 있습니다. – talonmies

답변

1

여기에 문의하기 전에 오류를 Google에 보내셨습니까? 어쨌든이 BoostInstallationHowto#LD_LIBRARY_PATH을 시도하십시오. 물어보기 전에 먼저 Google에 알려주십시오. 도움을 받으실 수 있습니다.

+0

고마워. 나는 이상한 오류라고 생각해서 구글을 깜박했다. – user1635666