gpt4 book ai didi

python - opencl 和 pyopencl 中的行和列主要

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:44 25 4
gpt4 key购买 nike

我是 opencl 的新手,也许我会问一些愚蠢的问题!

我在 python/pyopencl 中调整 c/opencl 程序时遇到了一些问题。特别是,我对 column-majorrow-major 命令的使用有点困惑。

考虑一个矩阵 M[i,j]Ni*Nj 维度,:

  • 列优先顺序定义为:i + Ni*j

  • 行优先顺序定义为:j + Nj*i

将此内核用于 (3,3) 的局部大小:

__kernel void major(__global double local_i_i_major,
__global double local_j_i_major,
__global double local_i_j_major,
__global double local_j_j_major)
{
int i = get_global_id(0) ;
int j = get_global_id(1) ;

int Ni = get_num_groups(0) * get_local_size(0) ;
int Nj = get_num_groups(1) * get_local_size(1) ;

int main_i_major = j + i*Nj ;
int main_j_major = i + j*Ni ;

local_i_i_major(main_i_major) = get_local_id(0) ;
local_j_i_major(main_i_major) = get_local_id(1) ;

local_i_j_major(main_j_major) = get_local_id(0) ;
local_j_j_major(main_j_major) = get_local_id(1) ;
}

我们可以看看本地索引的分布情况。

当使用 Column-major 时,我们得到:

|-------------------------- (i,j) ----------------------|
_________________________________________________________
| (0,0) | (1,0) | (2,0) | (0,0) | (1,0) | (2,0) |
| (0,0) | (1,0) | (2,0) | (0,0) | (1,0) | (2,0) |
| (0,0) | (1,0) | (2,0) | (0,0) | (1,0) | (2,0) |
| (0,1) | (1,1) | (2,1) | (0,1) | (1,1) | ... |
| (0,1) | (1,1) | (2,1) | (0,1) | ... | ... |
| (0,1) | (1,1) | (2,1) | ... | ... | ... |
_________________________________________________________

而且,当我们使用行优先时,我们得到:

|-------------------------- (i,j) ----------------------|
_________________________________________________________
| (0,0) | (0,1) | (0,2) | (0,0) | (0,1) | ... |
| (1,0) | (1,1) | (1,2) | (1,0) | ... | ... |
| (2,0) | (2,1) | (2,2) | (2,0) | ... | ... |
| (0,0) | (0,1) | (0,2) | (0,0) | (0,1) | ... |
| (1,0) | (1,1) | (1,2) | (1,0) | ... | ... |
| (2,0) | (2,1) | (2,2) | (2,0) | ... | ... |
_________________________________________________________

当然,这些分布是不同的。特别是,我不了解列优先顺序情况下的局部索引分布。某些工作项似乎具有相同的 ID?可能吗?

当我阅读有关C/openCL 的文献时,大多数时候使用column-major 顺序。当我阅读 Python/PyOpencl 示例时,这是使用的 row-major 顺序。

考虑到 Python 和 C 都使用 raw-major 顺序,为什么会存在这种差异?

此外,性能如何?使用 column-majorrow-major order 哪个更好?

是否可以更改 opencl 中值的排序方式?

最佳答案

您将内存布局的概念与工作组维度混淆了。 OpenCL 在最多 3 个维度上定义了工作空间的抽象 segmentation 。它们不必对应于任何特定的内存布局。最佳内存布局取决于您正在实现的特定算法。但是,OpenCL 不会将工作项映射到内存 - 您可以通过内存访问操作在内核中完成此操作。

OpenCL 驱动程序将逻辑上(因为它实际上是并行的)遍历工作组维度,但标准中未指定顺序,因为它取决于体系结构。在一个工作组中,所有工作项都可以被认为是并行执行的(尽管实际上可能不是)。但即使它们不代表特定的内存布局 - 例如,局部尺寸可能是 (16,1),但您可能正在访问内存中的 4x4 区域。

最佳映射取决于设备类型(GPU/FPGA 与 CPU),因为它们的架构不同。

总而言之,内存布局和逻辑维度(或域分解)这两个方面在一般情况下无法确定;它们取决于您正在实现的算法。

您在使用特定内核时遇到的问题是因为您无意义地混合了逻辑索引,然后将它们用裁剪理索引。如果您手动逐步执行代码,您就会明白为什么在输出中会出现重复的条目。

顺便说一句,您的代码看起来不像真正的内核——当然参数应该是指针;然后你用大括号符号 () 访问它们,我猜。

关于python - opencl 和 pyopencl 中的行和列主要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30806672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com