Могу ли я использовать псевдоним массива структур для массива членов структуры? - PullRequest
0 голосов
/ 01 октября 2018

Мне интересно, возможно ли создать / скопировать «виртуальный» массив определенного члена структуры в другой массив.Допустим, у нас есть структура

struct foo {
  int value;
  char character;
};

Теперь предположим, что есть массив, содержащий эту структуру foo, и у меня есть операция, которая должна добавить все int value вместе.Это обычно было бы очень легко с циклом, добавляющим все значения с указателем.Проблема в том, что я использую OpenCL и мне нужно скопировать массив на какое-либо устройство.В OpenCL это делается с помощью

clEnqueueWriteBuffer(cmdQueue, buffer, CL_TRUE, 0, datasize, A, 0, NULL, NULL);

, который скопирует массив buffer на устройство.Не имеет смысла копировать весь массив структур, так как для этого потребуется больше времени, поскольку он также отправляет character s, которые не нужны.Это также заняло бы больше места на устройстве OpenCL.Поэтому возможно ли скопировать «массив» из value s из структур непосредственно в виде массива на устройство?

Я знаю, что могу создать новый массив на хосте (ЦП) со всеми значениями, а затем скопировать этот массив на устройство OpenCL, но тогда я бы потратил время на копирование в локальный массив int изатем скопируйте этот массив на устройство OpenCL.

Можно ли скопировать "виртуальный" массив value с непосредственно из массива foo -структур, содержащий только int value с?

Пожалуйста, будьте осторожны,что это очень упрощенный пример моей реальной проблемы, и я хотел бы избежать с value в отдельном массиве с самого начала, на что структуры будут указывать.У меня есть большие сомнения, что это возможно, и если мое объяснение даже имеет смысл, но с нетерпением ждем обратной связи!

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Если у вас есть массив структур, вам понадобится промежуточный буфер с только значениями, то есть дополнительными копиями на стороне процессора.

Иногда такая работа неизбежна, но если вы можете, то лучшеиметь несколько массивов непрерывных значений.Даже при работе с чистым ЦП это часто более эффективно для кеша ЦП, поскольку позволяет избежать чтения / записи ненужных элементов и часто проще для наборов команд SIMD, таких как SSE.

Например, вы можете иметь int *values и char *chars той же длины (предпочтительнее какой-нибудь тип, например std::vector или std::unique_ptr<T[]>!), Тогда копия будет легкой.

0 голосов
/ 01 октября 2018

Нет.

clEnqueueWriteBuffer ожидает смежный контейнер.Вы не можете создать «виртуальный» смежный контейнер.

[I] хотел бы избежать хранения значений в отдельном массиве с самого начала.

На этом этапе выдолжен профилировать и сравнивать две реализации: одна копирует массив как есть с лишними данными, а другая создает локальную копию полезных данных для отправки.Сравните и выберите.

...