2017-02-23 46 views
0

У меня есть ядро, которое принимает следующие параметры:Способ смещения индексов в ядре OpenCl?

1) Глобальный идентификатор 1040

2) Локальный идентификатор 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]; 
} 

В то время как константа является постоянным, я хотел бы Offset быть «массив» сортов, содержащий значения 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]; 
    } 
} 

Обратите внимание: Scaling Глобальный идентификатор не вариант, так как в моем ядре она должна оставаться фиксированной. Поэтому: так или иначе, чтобы достичь этого?

EDIT: Я добавил пример того, что хотел бы реализовать. В настоящее время это не работает. Является ли это законным?

+0

Если элементы массива ноль, он не должен падать, если сработает, если нет, то они находятся за пределами границ буфера –

+0

@huseyintugrulbuyukisik Я отредактировал свой вопрос, может быть, это яснее. второе ядро, которое я разместил, не работает ... если вы скажете мне, что это законно, тогда у меня есть проблема в моем хост-коде – user1816546

ответ

1

Сообщение об ошибке я получил это

параметр не может быть выделена в имени адресного пространства

потому что constant является зарезервированным словом.

Я попытался изменить имя переменной, добавив '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]; 
    } 
} 

и это работает для глобальной = 1040, ABC_size = 1040 * 10, локальная = 16, смещение от 0 до 9 array и constant1 = 1040

+0

спасибо за подтверждение, но я не могу заставить его работать на моем ядре ... я дважды проверю мой код хоста – user1816546

+0

снова рушится? –

 Смежные вопросы

  • Нет связанных вопросов^_^