Работа с выделением вывода неопределенного размера в Renderscript

Я пытаюсь обдумать наиболее эффективный способ работы с массивами неопределенного размера в качестве выходных данных ядер RS. Я бы отправил индекс последнего соответствующего слота массива в выделении, но я узнал в ответ на мой предыдущий вопрос, нет хорошего способа передать глобальный код обратно в java после выполнения ядра. Я решил снова «уменьшить масштаб» процесса, что привело меня к шаблону ниже.

Например, предположим, что у нас есть входное распределение, содержащее структуру (или структуры), которая содержит два массива полярных координат; что-то вроде set_pair из ниже:

typedef struct polar_tag{
  uint8_t angle;
  uint32_t mag;
} polar;

typedef struct polar_set_tag{
  uint8_t filled_slots;
  polar coordinates[60];
} polar_set;

typedef struct set_pair_tag{
  polar_set probe_set;
  polar_set candidate_set;
} set_pair;

Мы хотим найти похожие пары координат между наборами, поэтому мы настраиваем ядро, чтобы решить, какие (если есть) полярные координаты похожи. Если они похожи, мы загружаем их в выходное распределение, которое выглядит примерно как «matching_set»:

typedef struct matching_pair_tag{
  uint8_t probe_index;
  uint8_t candidate_index;
} matching_pair;

typedef struct matching_set_tag{
  matching_pair pairs[120];
  uint8_t filled_slots;
} matching_set;

Является ли создание выделений с помощью таких инструкций, как «filled_slots», наиболее эффективным (или единственным) способом обработки такого неопределенного ввода-вывода с помощью RS, или есть лучший способ?


person sarwar    schedule 23.10.2013    source источник
comment
Не могли бы вы дать мне более подробную информацию о том, в каких парах, по вашему мнению, должен находиться поляр? Это 0-1 или 0-n? Это изменит доступные параметры.   -  person R. Jason Sams    schedule 23.10.2013
comment
0-2 ради этого примера, но мне было бы интересно, как обрабатывать случай 0-n.   -  person sarwar    schedule 23.10.2013


Ответы (1)


Я думаю, что я бы попытался подойти к этому, сделав два прохода.

Для случая 0-2:

Настройка: для каждой координаты выделите массив для хранения максимального ожидаемого количества пар (2).

Проход 1: пробег по координатам, поиск пар путем сравнения текущего элемента с подмножеством других координат. Выберите подмножество, чтобы избежать дублирования ответов, когда ядро ​​работает на другой сравниваемой координате.

Проход 2: объедините результаты из # 1 обратно в список или любую другую структуру данных, которую вы хотите. Может работать как вызываемый объект, если количество координат невелико.

Для случая 0-N:

Это становится намного сложнее. Я бы, вероятно, сделал что-то похожее на то, что указано выше, но с размером массива для каждой координаты, рассчитанным на типичное количество пар. Для (надеюсь, небольшого) количества переполнений используйте atomics, чтобы зарезервировать слот в буфере переполнения. Загвоздка здесь в том, что я думаю, что большинство драйверов графических процессоров не были бы очень довольны атомарными технологиями сегодня. Будет работать очень хорошо на CPU ref.

Есть много способов сделать это. Один из важных моментов принятия решения вращается вокруг того, насколько дорого стоит сравнение, чтобы найти баллы, по сравнению со стоимостью написания результата.

person R. Jason Sams    schedule 23.10.2013