为什么我的相当琐碎的CUDA程序在某些参数上出错?

为什么我的相当琐碎的CUDA程序在某些参数上出错?,cuda,pycuda,Cuda,Pycuda,我做了一个简单的CUDA练习程序。它只是将数据从一个阵列复制到另一个阵列: import pycuda.driver as cuda import pycuda.autoinit import numpy as np from pycuda.compiler import SourceModule # Global constants N = 2**20 # size of array a a = np.linspace(0, 1, N) e = np.empty_like(a) block_

我做了一个简单的CUDA练习程序。它只是将数据从一个阵列复制到另一个阵列:

import pycuda.driver as cuda
import pycuda.autoinit
import numpy as np
from pycuda.compiler import SourceModule

# Global constants
N = 2**20 # size of array a
a = np.linspace(0, 1, N)
e = np.empty_like(a)
block_size_x = 512

# Instantiate block and grid sizes.
block_size = (block_size_x, 1, 1)
grid_size = (N / block_size_x, 1)

# Create the CUDA kernel, and run it.
mod = SourceModule("""
  __global__ void D2x_kernel(double* a, double* e, int N) {
    int tid = blockDim.x * blockIdx.x + threadIdx.x;
    if (tid > 0 && tid < N - 1) {
      e[tid] = a[tid];
    }
  }
""")
func = mod.get_function('D2x_kernel')
func(a, cuda.InOut(e), np.int32(N), block=block_size, grid=grid_size)
print str(e) 
将pycuda.driver导入为cuda
导入pycuda.autoinit
将numpy作为np导入
从pycuda.compiler导入SourceModule
#全局常数
N=2**20#阵列a的大小
a=np.linspace(0,1,N)
e=np.空的(a)
块大小=512
#实例化块和网格大小。
块大小=(块大小x,1,1)
网格大小=(N/块大小,1)
#创建CUDA内核并运行它。
mod=SourceModule(“”)
__全局无效D2x内核(双*a,双*e,整数N){
int tid=blockDim.x*blockIdx.x+threadIdx.x;
如果(tid>0&&tid
但是,我得到了这个错误:
pycuda.\u driver.logicalError:culunchkernel失败:无效值


当我去掉内核函数中的第二个参数
double*e
并在没有参数
e
的情况下调用内核时,错误就消失了。为什么呢?此错误是什么意思?

您的
阵列在设备内存中不存在,因此我怀疑PyCUDA正在忽略(或以其他方式处理)内核调用的第一个参数,并且只传入
e
N
…因此您会得到一个错误,因为内核需要三个参数,而它只收到两个。从内核定义中删除
double*e
可能会消除收到的错误消息,但内核仍然无法正常工作

对此的一个快速修复方法应该是将
A
包装在
cuda.in()
调用中,该调用指示PyCUDA在启动内核之前将
A
复制到设备。也就是说,您的内核启动行应该是:

func(cuda.In(a), cuda.InOut(e), np.int32(N), block=block_size, grid=grid_size)

编辑:另外,您是否意识到您的内核没有将
a
的第一个和最后一个元素复制到
e
?您的
if(tid>0&&tid
语句阻止了这一点。对于整个数组,它应该是
if(tid

删除第二个参数会有所帮助,这很奇怪。您是否尝试过为数组显式指定复制方向:
func(cuda.In(a)、cuda.Out(e),