在自定义Cupy核中对多维cupy ndarray进行手动索引
CuPy自定义核:多维数组的预定义变量适配
CuPy逐元素自定义核中的预定义变量,本质是基于全局扁平化索引工作的,但可以通过_ind对象轻松转换为多维坐标,适配任意维度的数组:
关键变量的行为
i:无论输入数组是几维,i始终代表扁平化后的一维全局索引,取值范围是0到_ind.size()-1。_ind.size():返回数组的总元素数,等价于各维度长度的乘积(比如(2,3,4)的数组,返回值为24)。
多维坐标转换方法
通过_ind对象提供的接口,可将一维索引i转为对应维度的坐标:
_ind.get_dim(k):获取第k维的长度(维度索引从0开始)_ind.index(i, k):将扁平化索引i转换为第k维的坐标值
也可以手动计算多维坐标,比如针对二维数组(H, W):
int w_dim = _ind.get_dim(1); int h = i / w_dim; // 行坐标 int w = i % w_dim; // 列坐标
二维数组处理示例
extern "C" __global__ void multi_dim_kernel(const float* input, float* output) { int i = blockDim.x * blockIdx.x + threadIdx.x; if (i >= _ind.size()) return; // 通过_ind获取二维坐标 int row = _ind.index(i, 0); int col = _ind.index(i, 1); // 基于多维坐标做自定义计算 output[i] = input[i] * row + col; }
注意事项
- 逐元素核的线程分配由CuPy自动处理,无需手动适配多维的网格/块划分
- 使用
_ind的接口而非硬编码维度长度,能让核函数适配任意维度的输入数组
内容的提问来源于stack exchange,提问作者rak
相关产品推荐
相关产品推荐

