python - pycuda 中的 cudaMemcpyToSymbol

标签 python cuda pycuda

我正在使用 pycuda,我想知道是否有与函数 cudaMemcpyToSymbol 等效的函数

我想将一个常量从主机复制到设备,如下所示

import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy 
from sys import path
from struct import *
from gpustruct import GPUStruct


if __name__ == '__main__':

    # list devices
    ndevices = cuda.Device.count()
    print '{} devices found'.format(ndevices)
    for i in xrange(ndevices):
        print '  ', cuda.Device(i).name()





    # compile device.cu
    mod = SourceModule('''
    __device__ __constant__ int CONSTd;
    struct Results
        {
         float *A; 
     float *B;
     float *C;
        };

    struct fin
        {
         float *N;
        };

__global__ void  test(Results *src,fin *dest){
    int i=blockIdx.x *blockDim.x + threadIdx.x;
    src->C[i]=src->A[i]+src->B[i]+dest->N[i]+CONSTd;

    }''',
            nvcc='/opt/cuda65/bin/nvcc',
           )

kern = mod.get_function("test")




CONSTANTE=5
src_gpu = GPUStruct([(numpy.int32,'*A', numpy.ones(10,dtype=numpy.int32)),(numpy.int32,'*B', numpy.ones(10,dtype=numpy.int32)),(numpy.int32,'*C', numpy.zeros(10,dtype=numpy.int32))])
test_gpu = GPUStruct([(numpy.int32,'*N', numpy.array(10*[5],dtype=numpy.int32))])

#something like this:
**cudaMemcpyToSymbol(CONSTd, &CONSTANTE, sizeof(int));**

src_gpu.copy_to_gpu() 
test_gpu.copy_to_gpu() 
kern(src_gpu.get_ptr(),test_gpu.get_ptr(),block=(10,1,1),grid=(1,1))
src_gpu.copy_from_gpu()

print(src_gpu)

最佳答案

PyCUDA 实现直接遵循 CUDA 驱动程序 API,因此您可以使用任何可以找到的驱动程序 API 代码作为模型,但要实现此功能需要满足两件事:

  1. 使用模块函数module.get_global()检索指向已编译源模块内符号的设备指针
  2. 使用driver.memcpy_htod将值复制到该指针。请注意,PyCUDA API 要求对象支持 Python 缓冲区协议(protocol)。实际上,这意味着您应该在 Python 端使用 numpy.ndarray 或类似内容。

这实际上就是 cudaMemcpyToSymbol 在幕后所做的事情。

关于python - pycuda 中的 cudaMemcpyToSymbol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30614827/

相关文章:

python - 如何在多线程中运行TensorRT?

python - 使用 OrderedDict 进行 SQLAlchemy 关系()?

python - 比较 Python 字典和嵌套字典

python - Scrapy FakeUserAgentError : Error occurred during getting browser

cuda-gdb 在四个可用的支持 CUDA 的设备中只看到一个能力最低的设备

memory - 为什么全局内存版本比我的 CUDA 代码中的常量内存更快?

c - 在 Tesla K80 集群中使用点对点获取 nan 结果

python - 将列表插入单个 sqlite 数据库列

python - 如何从 gpu 内存地址创建 PyCUDA GPUArray?

python - 异步内核启动后返回 pyCUDA 中的主机代码