我正在使用 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 代码作为模型,但要实现此功能需要满足两件事:
- 使用模块函数
module.get_global()
检索指向已编译源模块内符号的设备指针 - 使用
driver.memcpy_htod
将值复制到该指针。请注意,PyCUDA API 要求对象支持 Python 缓冲区协议(protocol)。实际上,这意味着您应该在 Python 端使用numpy.ndarray
或类似内容。
这实际上就是 cudaMemcpyToSymbol
在幕后所做的事情。
关于python - pycuda 中的 cudaMemcpyToSymbol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30614827/