python cpp cuda混合编程_PyCUDA - 传递一个矩阵引用从Python到C++ CUDA代码

您应该使用内核中投线性存储器访问,那是多么ndarray和gpuarray数据存储在内部,并且当它作为一个参数传递给供应PyCUDA将传递一个指针在分配给gpuarray在GPU mempoy数据PyCUDA内核。所以(如果我明白你正在尝试做的)内核应该写成类似:

__device__ unsigned int idx2d(int i, int j, int lda)

{

return j + i*lda;

}

__global__ void distance(int N, int M, float *d1, float *d2, float *res)

{

int i = threadIdx.x + blockDim.x * blockIdx.x;

int j = threadIdx.y + blockDim.y * blockIdx.y;

float x, y, z;

x = d2[idx2d(j,0,3)]-d1[idx2d(i,0,3)];

y = d2[idx2d(j,1,3)]-d1[idx2d(i,1,3)];

z = d2[idx2d(j,2,3)]-d1[idx2d(i,2,3)];

res[idx2d(i,j,N)] = x*x + y*y + z*z;

}

在这里,我假设numpy默认行的主要排序在定义idx2d辅助函数。您发布代码的Python方面仍存在问题,但我想你已经知道了。

编辑:这是根据张贴在你的问题的代码的完整的摄制工作情况。请注意,它只使用一个块(如原始块),因此在试图在除普通小外壳以外的任何其他任何内容上运行时,请注意块和网格的尺寸。

import numpy as np

from pycuda import compiler, driver

from pycuda import autoinit

#kernel declaration

mod = compiler.SourceModule("""

__device__ unsigned int idx2d(int i, int j, int lda)

{

return j + i*lda;

}

__global__ void distance(int N, int M, float *d1, float *d2, float *res)

{

int i = threadIdx.x + blockDim.x * blockIdx.x;

int j = threadIdx.y + blockDim.y * blockIdx.y;

float x, y, z;

x = d2[idx2d(j,0,3)]-d1[idx2d(i,0,3)];

y = d2[idx2d(j,1,3)]-d1[idx2d(i,1,3)];

z = d2[idx2d(j,2,3)]-d1[idx2d(i,2,3)];

res[idx2d(i,j,N)] = x*x + y*y + z*z;

}

""")

#make data

data1 = np.random.uniform(size=18).astype(np.float32).reshape(-1,3)

data2 = np.random.uniform(size=12).astype(np.float32).reshape(-1,3)

N=data1.shape[0]

M=data2.shape[0]

res = np.zeros([N,M]).astype(np.float32) # NxM matrix

#invoke kernel

dist_gpu = mod.get_function("distance")

dist_gpu(np.int32(N), np.int32(M), driver.In(data1), driver.In(data2), \

driver.Out(res), block=(N,M,1), grid=(1,1))

print res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值