이것은 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
제발 도와주세요.
이것은 아주 자명 한 오류입니다. boost.python을 설치하지 않았거나 실행중인 python 인스턴스에서 찾을 수없는 장소에 있습니다. – talonmies