Python PyCUDA奇怪错误:内核失败:无效值

Python PyCUDA奇怪错误:内核失败:无效值,python,cuda,pycuda,Python,Cuda,Pycuda,当我试图使用下面的脚本将数据返回cpu时,出现了一个错误。 当我尝试在“ref”中输入一些值时,如果我只输入: ref[1] = 255; ref[0] = 255; ref[2] = 255; 但如果我这样做: if (verschil.a[idx+idy*640]>5){ ref[1] = 255; ref[0] = 255; ref[2] = 255; } 我收到的错误消息是: Traceback (most recent call last): File "./zwartw

当我试图使用下面的脚本将数据返回cpu时,出现了一个错误。 当我尝试在“ref”中输入一些值时,如果我只输入:

ref[1] = 255; ref[0] = 255; ref[2] = 255;
但如果我这样做:

if (verschil.a[idx+idy*640]>5){
  ref[1] = 255; ref[0] = 255; ref[2] = 255;
}
我收到的错误消息是:

Traceback (most recent call last):
File "./zwartwit.py", line 159, in <module>
verwerking(cuda.InOut(refe),cuda.InOut(frame), block=(640, 1, 1))
File "/usr/lib/python2.7/dist-packages/pycuda/driver.py", line 374, in function_call
func._launch_kernel(grid, block, arg_buf, shared, None)
pycuda._driver.LogicError: cuLaunchKernel failed: invalid value
回溯(最近一次呼叫最后一次):
文件“/zwartwit.py”,第159行,在
verwerking(cuda.InOut(参考),cuda.InOut(框架),block=(640,1,1))
文件“/usr/lib/python2.7/dist packages/pycuda/driver.py”,第374行,在函数调用中
函数启动内核(网格、块、参数、共享、无)
pycuda.\u driver.LogicError:内核失败:无效值
谢谢你的帮助

ps,这是我刚才说的剧本的一个同情版本。若要获得相同的错误,必须删除//

import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy
import cv2
from time import time,sleep

mod = SourceModule("""
struct legear{ int a[307200];};
__global__ void totaal(int *ref){ 
  int idx = threadIdx.x + blockIdx.x *  blockDim.x;
  legear test;
  for (int idy=0;idy<480;idy++){
    if (idy < 480){
      if (idx < 640){
    if (ref[idx*3+idy*640*3]>100){
      test.a[idx+idy*640] = 255;
    }
    //if (test.a[idx+idy*640] == 255){
      ref[idx*3+idy*640*3] = 255; ref[idx*3+idy*640*3+1] = 255; ref[idx*3+idy*640*3+2] = 255; 
    //}
      }
    }
  }
  }
""")

camera = cv2.VideoCapture(0)
im2 = numpy.zeros((768, 1024, 1 ),dtype=numpy.uint8)
cv2.imshow("projector", im2)
key = cv2.waitKey(100)
for i in range(0,8):
  refe = camera.read()[1]
im2[500:502] = [100]
cv2.imshow("projector", im2)
key = cv2.waitKey(100)
verwerking = mod.get_function("totaal")
refe = refe.astype(numpy.int32)
verwerking(cuda.InOut(refe), block=(640, 1, 1))
refe = refe.astype(numpy.uint8)
cv2.imshow("test", refe)
cv2.waitKey(200)
raw_input()
将pycuda.driver导入为cuda
导入pycuda.autoinit
从pycuda.compiler导入SourceModule
进口numpy
进口cv2
从时间导入时间,睡眠
mod=SourceModule(“”)
结构legear{inta[307200];};
__全局无效totaal(int*ref){
int idx=threadIdx.x+blockIdx.x*blockDim.x;
legear试验;
对于(整数Y=0;整数Y=100){
测试a[idx+idy*640]=255;
}
//如果(测试a[idx+idy*640]==255){
参考[idx*3+idy*640*3]=255;参考[idx*3+idy*640*3+1]=255;参考[idx*3+idy*640*3+2]=255;
//}
}
}
}
}
""")
摄像机=cv2。视频捕获(0)
im2=numpy.zeros((7681021),dtype=numpy.uint8)
cv2.imshow(“投影仪”,im2)
key=cv2.waitKey(100)
对于范围(0,8)内的i:
refe=摄像机。读取()[1]
im2[500:502]=[100]
cv2.imshow(“投影仪”,im2)
key=cv2.waitKey(100)
verwerking=mod.get_函数(“totaal”)
refe=refe.astype(numpy.int32)
verwerking(cuda.InOut(参考文献),block=(640,1,1))
refe=refe.astype(numpy.uint8)
cv2.imshow(“测试”,参考)
cv2.等待键(200)
原始输入()

这里的基本问题是内核中
测试的大小。正如您所写的,每个线程都需要1228800字节的本地内存。运行时必须为每个线程保留该内存—因此,您的代码需要750Mb的可用内存才能分配给设备上的本地内存,以支持您尝试启动的每个块640个线程。我猜你的设备没有那么多的可用内存

您所展示的代码在没有if语句的情况下工作的原因在于编译器优化—在这种情况下,
test
实际上没有用于任何事情,编译器只是将其从代码中删除,这消除了内核巨大的本地内存占用,并允许其运行。取消对if语句的注释时,
test
确定全局内存写入的状态,因此编译器无法对其进行优化,内核需要大量本地内存才能运行

这是我在发布内核代码时看到的编译器输出:

> nvcc -arch=sm_21 -Xptxas="-v" -m32 -c wnkr_py.cu
wnkr_py.cu
wnkr_py.cu(7): warning: variable "test" was set but never used

tmpxft_00000394_00000000-5_wnkr_py.cudafe1.gpu
tmpxft_00000394_00000000-10_wnkr_py.cudafe2.gpu
wnkr_py.cu
wnkr_py.cu(7): warning: variable "test" was set but never used

ptxas : info : 0 bytes gmem
ptxas : info : Compiling entry function '_Z6totaalPi' for 'sm_21'
ptxas : info : Function properties for _Z6totaalPi
    0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas : info : Used 8 registers, 36 bytes cmem[0], 4 bytes cmem[16]
tmpxft_00000394_00000000-5_wnkr_py.cudafe1.cpp
tmpxft_00000394_00000000-15_wnkr_py.ii
请注意编译器警告和堆栈帧大小

如果if语句处于活动状态:

>nvcc -arch=sm_21 -Xptxas="-v" -m32 -c wnkr_py.cu
wnkr_py.cu
tmpxft_000017c8_00000000-5_wnkr_py.cudafe1.gpu
tmpxft_000017c8_00000000-10_wnkr_py.cudafe2.gpu
wnkr_py.cu
ptxas : info : 0 bytes gmem
ptxas : info : Compiling entry function '_Z6totaalPi' for 'sm_21'
ptxas : info : Function properties for _Z6totaalPi
    1228800 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas : info : Used 7 registers, 36 bytes cmem[0]
tmpxft_000017c8_00000000-5_wnkr_py.cudafe1.cpp
tmpxft_000017c8_00000000-15_wnkr_py.ii
请注意,堆栈帧大小更改为每个线程1228800字节


我对代码的快速阅读表明,
test
不需要像您定义的那样大,代码才能运行,但我将所需的大小留给读者作为练习….

您发布的CUDA内核代码甚至没有编译!如果您能提供一个简短的、可编译的案例来演示您的问题,我们可能无法帮助您。投票关闭。谢谢你这么说,我更改了代码来指定问题。你的操作真的不是很容易。现在我们有了需要OpenCV和捕获设备才能运行的代码,而OpenCV的内容与问题完全无关。请想一想那些真正免费提供时间帮助并使生活尽可能轻松的人。。。。。