我是opencl的新手,也许我会问愚蠢的问题!行和列主要在opencl和pyopencl
我遇到了一些问题,修改python/pyopencl
中的c/opencl
程序。特别是,我对使用列主要和行主要命令有点迷惑。
考虑矩阵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) ;
}
我们可以看看本地索引的分布。
当使用列为主,我们得到:
|-------------------------- (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
的文献时,列主要订单大多数时间使用。当我读取Python/PyOpencl
例子时,这是行主要订单它被使用。
考虑到Python和C都使用原始主要顺序,为什么存在这种差异?
另外,性能呢?使用列专业或行专业命令是否更好?
是否有可能改变opencl中的值的排序方式?