我是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中的值的排序方式?