【发布时间】:2019-02-26 05:50:54
【问题描述】:
我是 pycuda 的新手。在我的代码中,每个线程都需要计算一行二维数组。但是,正如我在示例中看到的,仅使用基于元素的分布。如何根据数组的行分配它?
【问题讨论】:
-
你问的是
ElementwiseKernel吗?还是通用的CUDA内核代码? -
一个通用的 CUDA 内核。
我是 pycuda 的新手。在我的代码中,每个线程都需要计算一行二维数组。但是,正如我在示例中看到的,仅使用基于元素的分布。如何根据数组的行分配它?
【问题讨论】:
ElementwiseKernel吗?还是通用的CUDA内核代码?
....基于元素的分布
这是一个非常奇怪的术语,因为在 CUDA 或 PyCUDA 中根本没有“分布”的概念。在 CUDA 中,给定线程如何处理输入数据完全由程序员自行决定,没有任何类型的预定义“分布”。
所以在标准的 CUDA C 内核中(这是您在 PyCUDA 中编写的,它实际上只是一个 API 包装器和编译系统),您可以对行主要有序输入执行类似的操作:
__global__
void kernel(float* array, int lda)
{
int tid = threadIdx.x + blockIdx.x * blockDim.x;
int rowid = tid * lda;
float* row = array + rowid;
for(int col=0; col<lda; col++) {
row[col] = ....;
}
}
[显然从未编译或测试过,使用风险自负]
设置代码将row 保留为指向输入数组给定行的第一个元素的指针,该数组的前导维度为lda。显然,列主存储的代码会发生变化,我把它留给读者练习。
【讨论】: