我对openCL完全陌生。我试图将顺序 3d 矩阵代码转换为 3d 矩阵的 openCL 版本。我已经实现了 openCL 的基本功能,但被困在 OpenCL 内核中。我得到了 3d 矩阵的所有索引,但不明白如何访问不同维度的索引。任何人都可以帮助我吗?
也欢迎您向我提出解决此问题的更好方法。提前致谢。
这是我的代码的一小部分。
顺序代码:
const int depth = 3;
const int row = 4;
const int column = 4;
float A[depth][row][column];
for (int k = 0; k < depth; k++){
for (int i = 0; i < row; i++){
for (int j = 0; j < column; j++){
if (k == 0){
A[k][i][j] = (float)i / ((float)j + 1.00);
}else if (k == 1){
A[k][i][j] = 1.00;
}else{
A[k][i][j] = (float)j / ((float)i + 1.00);
}
}
}
}
OpenCL 内核代码:
__kernel void ThreeDimArray(__global float *const output1) {
const int x = get_global_id(0);
const int y = get_global_id(1);
const int z = get_global_id(2);
const int max_x = get_global_size(0);
const int max_y = get_global_size(1);
const int max_z = get_global_size(2);
const int idx = x * max_y * max_z + y * max_z + z;
output1[idx] = 1.00;
};
顺序代码输出:
Baseline matrix k = 0
0.00 0.00 0.00 0.00
1.00 0.50 0.33 0.25
2.00 1.00 0.67 0.50
3.00 1.50 1.00 0.75
Baseline matrix k = 1
1.00 1.00 1.00 1.00
1.00 1.00 1.00 1.00
1.00 1.00 1.00 1.00
1.00 1.00 1.00 1.00
Baseline matrix k = 2
0.00 1.00 2.00 3.00
0.00 0.50 1.00 1.50
0.00 0.33 0.67 1.00
0.00 0.25 0.50 0.75
编辑: 如果我们想用其他索引值更新特定索引怎么办。 例如:
for (int t = 0; t < 24; t++){
for (int i = 1; i < row; i++){
for (int j = 0; j < column; j++){
A[1][i][j] = A[1][i][j] + (1 / (sqrt(A[0][i + 1][j] + A[2][i - 1][j])));
}
}
}
我试过这样(内核代码):
const int idk0 = 0 * row * column + i * column + j;
const int idk1 = 1 * row * column + i * column + j;
const int idk2 = 2 * row * column + i * column + j;
for (int t = 0; t < 24; t++) {
A[idk1] = A[idk1] + (1 / (sqrt(A[idk0 + 1] + A[idk2 - 1])));
}