当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python mxnet.rtc.CudaModule用法及代码示例


用法:

class mxnet.rtc.CudaModule(source, options=(), exports=())

参数

  • source(str) - 完整的源代码。
  • options(tuple of str) - 编译器标志。例如,使用 “-I/usr/local/cuda/include” 添加 cuda 标头以包含路径。
  • exports(tuple of str) - 导出内核名称。

基础:object

从 Python 编译和运行 CUDA 代码。

在 CUDA 7.5 中,您需要在内核定义前添加“extern “C””以避免名称混淆:

source = r'''
extern "C" __global__ void axpy(const float *x, float *y, float alpha) {
    int i = threadIdx.x + blockIdx.x * blockDim.x;
    y[i] += alpha * x[i];
}
'''
module = mx.rtc.CudaModule(source)
func = module.get_kernel("axpy", "const float *x, float *y, float alpha")
x = mx.nd.ones((10,), ctx=mx.gpu(0))
y = mx.nd.zeros((10,), ctx=mx.gpu(0))
func.launch([x, y, 3.0], mx.gpu(0), (1, 1, 1), (10, 1, 1))
print(y)

从 CUDA 8.0 开始,您可以改为按名称导出函数。这也允许您使用模板:

source = r'''
template<typename DType>
__global__ void axpy(const DType *x, DType *y, DType alpha) {
    int i = threadIdx.x + blockIdx.x * blockDim.x;
    y[i] += alpha * x[i];
}
'''
module = mx.rtc.CudaModule(source, exports=['axpy<float>', 'axpy<double>'])
func32 = module.get_kernel("axpy<float>", "const float *x, float *y, float alpha")
x = mx.nd.ones((10,), dtype='float32', ctx=mx.gpu(0))
y = mx.nd.zeros((10,), dtype='float32', ctx=mx.gpu(0))
func32.launch([x, y, 3.0], mx.gpu(0), (1, 1, 1), (10, 1, 1))
print(y)

func64 = module.get_kernel("axpy<double>", "const double *x, double *y, double alpha")
x = mx.nd.ones((10,), dtype='float64', ctx=mx.gpu(0))
y = mx.nd.zeros((10,), dtype='float64', ctx=mx.gpu(0))
func32.launch([x, y, 3.0], mx.gpu(0), (1, 1, 1), (10, 1, 1))
print(y)

相关用法


注:本文由纯净天空筛选整理自apache.org大神的英文原创作品 mxnet.rtc.CudaModule。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。