Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的pyCuda索引工作如何?_Cuda_Gpgpu_Pycuda - Fatal编程技术网

我的pyCuda索引工作如何?

我的pyCuda索引工作如何?,cuda,gpgpu,pycuda,Cuda,Gpgpu,Pycuda,我正在尝试将3d阵列加载到pycuda中(我将加载图像)。我希望每个线程使用for循环处理单个像素的所有通道(这是算法要求) 到目前为止,我的工作如下: from pycuda.compiler import SourceModule mod = SourceModule(open("./cudacode.cu").read()) multiply_them = mod.get_function("multiply_them") rows,cols = 800,400 a = numpy

我正在尝试将3d阵列加载到pycuda中(我将加载图像)。我希望每个线程使用for循环处理单个像素的所有通道(这是算法要求)

到目前为止,我的工作如下:

from pycuda.compiler import SourceModule
mod = SourceModule(open("./cudacode.cu").read())  

multiply_them = mod.get_function("multiply_them")

rows,cols = 800,400
a = numpy.random.randn(rows,cols,3).astype(numpy.float32)
b = numpy.random.randn(rows,cols,3).astype(numpy.float32)



threads = 20
blocks = 16

dest = numpy.zeros_like(a)
multiply_them(
        drv.Out(dest), drv.In(a), drv.In(b),np.int32(rows), np.int32(cols),  # notice it is rows, cols
        block=(blocks,blocks,1), grid=(rows//blocks,cols//blocks))

print( dest- 2*a*b)
print(np.unique( dest- 2*a*b))
我的cuda代码是:

__global__ void multiply_them(float *dest, float *a, float *b,int cols,int rows) # notice it is cols , rows  and not rows, cols 
{
    int row = blockIdx.y * blockDim.y + threadIdx.y;
    int col = blockIdx.x * blockDim.x + threadIdx.x;

    if(row<rows && col <cols){

    dest[3* (row*cols + col)] =   2.0* a[3* (row*cols + col)  ]* b[3* (row*cols + col)  ] ; ## first channel of some pixel
    dest[3* (row*cols + col)+1] = 2.0* a[3* (row*cols + col)+1]* b[3* (row*cols + col)+1] ; ## second channel of that pixel
    dest[3* (row*cols + col)+2] = 2.0* a[3* (row*cols + col)+2]* b[3* (row*cols + col)+2] ; ## 3rd channel of that pixel 


    }
}
\uuuuu global\uuuu无效乘法(float*dest,float*a,float*b,int cols,int rows)#注意是cols,rows,而不是rows,cols
{
int row=blockIdx.y*blockDim.y+threadIdx.y;
int col=blockIdx.x*blockDim.x+threadIdx.x;
if(rowNumpy数组默认使用。CUDA块中的线程是变化最快的维度,
threadIdx.x
是变化最快的维度,
threadIdx.z
是变化最慢的维度(功能相当于列主顺序)。因此,如果您希望访问行主有序数据,就像在默认有序numpy数组中一样,并保持允许的访问顺序,那么您应该“反向”使用块中的x和y维度。如果您的numpy数组是列主有序的(
order='F'
),那么您不会这样做


这就是为什么你的代码可以正确工作,而你的直觉是不应该的。

只需交换列变量名和行变量名就可以了。你能告诉我这个问题的一般公式:dest[3*(row*cols+col)+1]并且为什么要使用我的索引方法?(在交换了你提到的x和y之后)