在OpenCl内核中偏移索引的方法?

在OpenCl内核中偏移索引的方法?,opencl,gpu,Opencl,Gpu,我有一个内核,它接受以下参数: 1) 全局ID是1040 2) 本地ID是16 下面不是我正在使用的内核,但我正在使用它来说明我想要实现什么;基本上,A和B的阵列输入长度为1040*10 __kernel void vector_add(__global const int *A, __global const int *B, __global int *C, int Offset, int constant) { // Index of the current element to

我有一个内核,它接受以下参数:

1) 全局ID是1040

2) 本地ID是16

下面不是我正在使用的内核,但我正在使用它来说明我想要实现什么;基本上,A和B的阵列输入长度为1040*10

__kernel void vector_add(__global const int *A, __global const int *B, __global int *C, int Offset, int constant) {

    // Index of the current element to be processed
    int i = get_global_id(0);


    // Do the operation
    C[i + Offset*constant] = A[i + Offset*constant] + B[i + Offset*constant];
}
鉴于常数是常数,我希望偏移量是一个排序的“数组”,包含值0,1,…,9。我已经尝试将这些值作为数组传递,但是我认为不可能以这种方式使用数组进行偏移(程序崩溃)。我想写的示例如下:

__kernel void vector_add(__global const int *A, __global const int *B, __global int *C, __constant const int *Offset, int constant) {

    // Index of the current element to be processed
    int i = get_global_id(0);

    for (int k = 0; k < 10; k++) {
    // Do the operation
    C[i + Offset[k]*constant] = A[i + Offset[k]*constant] + B[i + Offset[k]*constant];
    }
}
\uuuuuuu内核无效向量\uuu add(\uuuuu全局常量int*A、\uuuu全局常量int*B、\uuuu全局常量int*C、\uuuu常量常量int*Offset、int常量){
//要处理的当前元素的索引
int i=获取全局id(0);
对于(int k=0;k<10;k++){
//做手术
C[i+偏移量[k]*常数]=A[i+偏移量[k]*常数]+B[i+偏移量[k]*常数];
}
}
请注意:缩放全局ID不是一个选项,因为在我的内核中它需要保持固定。因此:究竟有没有办法做到这一点

编辑:我添加了一个我想要实现的示例。目前,它不是这样工作的。这合法吗

我收到的错误消息是

无法在命名地址空间中分配参数

因为
常量
是保留字

我尝试通过在变量名称末尾添加“1”来更改变量名称,如下所示:

__kernel void vector_add(__global  int *A,       __global  int *B, __global int *C,
                         __constant  int *Offset,__constant  int * constant1) {

    int i = get_global_id(0);
    int constVar=constant1[0];
    for (int k = 0; k < 10; k++) {
        C[i + Offset[k]*constVar] = A[i + Offset[k]*constVar] + B[i + Offset[k]*constVar];
    }
} 
\uuuuuu内核无效向量\uu add(\uuuuu全局int*A,\uuuu全局int*B,\uuuu全局int*C,
__常数int*Offset,u常数int*constant1){
int i=获取全局id(0);
int constVar=constant1[0];
对于(int k=0;k<10;k++){
C[i+Offset[k]*constVar]=A[i+Offset[k]*constVar]+B[i+Offset[k]*constVar];
}
} 

它适用于全局=1040,ABC_size=1040*10,局部=16,从0到9的偏移量数组和constant1=1040

如果数组元素为零,它不应该崩溃,如果不崩溃时崩溃,那么它们就超出了buffer@huseyintugrulbuyukisik我编辑了我的问题,也许它更清楚。我发布的第二个内核不工作。。。如果你告诉我这是合法的,那么我的主机代码有问题谢谢你的确认,但我无法让它在我的内核上工作。。。我会再次检查我的主机代码它是否再次崩溃?