pycuda 中的 cudaMemcpyToSymbol
cudaMemcpyToSymbol in 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 代码作为模型,但要实现此功能需要两件事:
- 使用模块函数
module.get_global()
检索指向已编译源模块中符号的设备指针
- 使用
driver.memcpy_htod
将值复制到该指针。请注意 PyCUDA APIs 要求对象支持 Python 缓冲协议。实际上,这意味着您应该在 Python 端使用 numpy.ndarray
或类似的。
这实际上是 cudaMemcpyToSymbol
在幕后所做的。
我正在使用 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 APIs 要求对象支持 Python 缓冲协议。实际上,这意味着您应该在 Python 端使用numpy.ndarray
或类似的。
这实际上是 cudaMemcpyToSymbol
在幕后所做的。