Python 3.x Numpy/Numba在向CUDA分配非常大的空集时引发错误

Python 3.x Numpy/Numba在向CUDA分配非常大的空集时引发错误,python-3.x,numpy,numba,Python 3.x,Numpy,Numba,我正在用Numba/Numpy编写一个Mandelbrot集生成器。优化之一是使用cudatoolkit通过Numba将计算推送到CUDA。该脚本适用于低分辨率集,但在尝试计算大型集时会出现错误 将numpy导入为np 从pylab导入imshow,show 导入时间 来自numba import cuda 从一个进口* 导入matplotlib def mandel(x,y,max_iters): c=复数(x,y) z=0.0j 对于范围内的i(最大值): z=z*z+c 如果(z.real

我正在用Numba/Numpy编写一个Mandelbrot集生成器。优化之一是使用cudatoolkit通过Numba将计算推送到CUDA。该脚本适用于低分辨率集,但在尝试计算大型集时会出现错误

将numpy导入为np
从pylab导入imshow,show
导入时间
来自numba import cuda
从一个进口*
导入matplotlib
def mandel(x,y,max_iters):
c=复数(x,y)
z=0.0j
对于范围内的i(最大值):
z=z*z+c
如果(z.real*z.real+z.imag*z.imag)>=4:
返回i
返回最大值
mandel_gpu=cuda.jit(设备=True)(mandel)
@cuda.jit
def mandel_内核(min_x、max_x、min_y、max_y、image、iters):
高度=图像。形状[0]
宽度=图像。形状[1]
像素大小=(最大值x-最小值x)/宽度
像素大小=(最大值-最小值)/高度
startX,startY=cuda.grid(2)
gridX=cuda.gridDim.x*cuda.blockDim.x;
gridY=cuda.gridDim.y*cuda.blockDim.y;
对于范围内的x(起始、宽度、网格x):
实=最小值x+x*像素大小x
对于范围内的y(起点、高度、网格):
imag=最小值y+y*像素大小y
图像[y,x]=mandel_gpu(real,imag,iters)/iters
gimage=np.zero((65536,65536),dtype=np.uint8)
#gimage=np.zero((10241024),dtype=np.uint8)
blockdim=(32,8)
griddim=(32,16)
开始=时间。时间()
d_image=cuda.to_设备(gimage)
mandel_内核[griddim,blockdim](-2.0,2.0,-2.0,2.0,d_图像,10000)
d_image.to_host()
dt=时间。时间()-开始
打印(“Mandelbrot在“+str(dt)+”秒内创建”)
imshow(gimage,“灰色”)
show()
#matplotlib.image.imsave(“mandel.png”,gimage)
在46000 x 46000像素以上,python会引发以下错误:

Traceback (most recent call last):
  File "C:\_main\Files\Mandel\mandel_cuda.py", line 46, in <module>
    d_image = cuda.to_device(gimage)
  File "C:\ProgramData\Anaconda3\lib\site-packages\numba\cuda\cudadrv\devices.py", line 212, in _require_cuda_context
    return fn(*args, **kws)
  File "C:\ProgramData\Anaconda3\lib\site-packages\numba\cuda\api.py", line 103, in to_device
    to, new = devicearray.auto_device(obj, stream=stream, copy=copy)
  File "C:\ProgramData\Anaconda3\lib\site-packages\numba\cuda\cudadrv\devicearray.py", line 688, in auto_device
    devobj.copy_to_device(obj, stream=stream)
  File "C:\ProgramData\Anaconda3\lib\site-packages\numba\cuda\cudadrv\devices.py", line 212, in _require_cuda_context
    return fn(*args, **kws)
  File "C:\ProgramData\Anaconda3\lib\site-packages\numba\cuda\cudadrv\devicearray.py", line 181, in copy_to_device
    sentry_contiguous(self)
  File "C:\ProgramData\Anaconda3\lib\site-packages\numba\cuda\cudadrv\devicearray.py", line 657, in sentry_contiguous
    core = array_core(ary)
  File "C:\ProgramData\Anaconda3\lib\site-packages\numba\cuda\cudadrv\devicearray.py", line 647, in array_core
    return ary[tuple(core_index)]
  File "C:\ProgramData\Anaconda3\lib\site-packages\numba\cuda\cudadrv\devices.py", line 212, in _require_cuda_context
    return fn(*args, **kws)
  File "C:\ProgramData\Anaconda3\lib\site-packages\numba\cuda\cudadrv\devicearray.py", line 479, in __getitem__
    return self._do_getitem(item)
  File "C:\ProgramData\Anaconda3\lib\site-packages\numba\cuda\cudadrv\devicearray.py", line 493, in _do_getitem
    newdata = self.gpu_data.view(*extents[0])
  File "C:\ProgramData\Anaconda3\lib\site-packages\numba\cuda\cudadrv\driver.py", line 1227, in view
    raise RuntimeError("non-empty slice into empty slice")
RuntimeError: non-empty slice into empty slice
回溯(最近一次呼叫最后一次):
文件“C:\\u main\Files\Mandel\Mandel\u cuda.py”,第46行,在
d_image=cuda.to_设备(gimage)
文件“C:\ProgramData\Anaconda3\lib\site packages\numba\cuda\cudadrv\devices.py”,第212行,在\u require\u cuda\u上下文中
返回fn(*args,**kws)
文件“C:\ProgramData\Anaconda3\lib\site packages\numba\cuda\api.py”,第103行,在to_设备中
to,new=devicearray.auto_设备(obj,stream=stream,copy=copy)
文件“C:\ProgramData\Anaconda3\lib\site packages\numba\cuda\cudadrv\devicearray.py”,第688行,在自动\u设备中
devobj.copy_到_设备(对象,流=流)
文件“C:\ProgramData\Anaconda3\lib\site packages\numba\cuda\cudadrv\devices.py”,第212行,在\u require\u cuda\u上下文中
返回fn(*args,**kws)
文件“C:\ProgramData\Anaconda3\lib\site packages\numba\cuda\cudadrv\devicearray.py”,第181行,复制到设备
哨兵(自我)
文件“C:\ProgramData\Anaconda3\lib\site packages\numba\cuda\cudadrv\devicearray.py”,第657行,在sentry\u中
核心=阵列\核心(ary)
文件“C:\ProgramData\Anaconda3\lib\site packages\numba\cuda\cudadrv\devicearray.py”,第647行,在数组\u core中
返回元[元组(核心索引)]
文件“C:\ProgramData\Anaconda3\lib\site packages\numba\cuda\cudadrv\devices.py”,第212行,在\u require\u cuda\u上下文中
返回fn(*args,**kws)
文件“C:\ProgramData\Anaconda3\lib\site packages\numba\cuda\cudadrv\devicearray.py”,第479行,在u getitem中__
返回自我。_do_getitem(项目)
文件“C:\ProgramData\Anaconda3\lib\site packages\numba\cuda\cudadrv\devicearray.py”,第493行,在\u do\u getitem中
newdata=self.gpu\u data.view(*区段[0])
文件“C:\ProgramData\Anaconda3\lib\site packages\numba\cuda\cudadrv\driver.py”,第1227行,在视图中
raise RUNTIMERROR(“将非空切片转换为空切片”)
RuntimeError:将非空切片转换为空切片

该脚本在带有4GB VRAM的1050ti上运行。对于46000 x 46000像素,VRAM的使用率仅为2.1GB。对于46000 x 46000以上的渲染,应该有大量的VRAM。

这似乎是一个VRAM溢出问题。在渲染的前30秒,将使用更多VRAM存储空集。初始化时,会很快达到4GB限制,使脚本崩溃。

这似乎是一个VRAM溢出问题。在渲染的前30秒,将使用更多VRAM存储空集。初始化时,会很快达到4GB限制,使脚本崩溃