Как данные передаются в память устройства из памяти хоста в OpenCL? - PullRequest
0 голосов
/ 04 марта 2012

У меня есть видеокарта ATI RV770, и я использую OpenCL 1.0 AMD-APP-SDK-v2.5 для запуска программ OpenCL.

Для передачи данных из памяти хоста в память устройства я использую

d_A = clCreateBuffer ( context, CL_MEM_READ_ONLY , partition_size * sizeof(datatype),NULL, &err); checkStatus("Failed to create device input buffer A  ",err);
err = clEnqueueWriteBuffer ( cmd_queue, d_A, CL_TRUE, 0, partition_size * sizeof(datatype), &h_A, 0, 0 , 0); checkStatus("Failed to copy data from host to device ",err);

Мой вопрос заключается в том, как данные копируются в память устройства (поразрядно или побайтно или> = 32-битно)?

Предположим, у меня есть h_A следующего типа структуры: *

typedef struct abc{int a; unsigned char ch[64]; } ABC;

, и я хочу передать 1000 элементов типа структуры ABC,

Могу ли я передать данные типа структуры?Если да, то как данные будут скопированы в память устройства?

В целом, что действительно характерно для перемещения данных в компьютере?

1 Ответ

1 голос
/ 05 марта 2012

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

Что касается структур:

Возможно, вам придется позаботитьсяразличных отступов, используемых в вашем компиляторе хоста и компиляторе OpenCL.Самый простой способ обойти это - использовать 1-байтовое выравнивание в структуре хоста (проверьте, что инструкции вашего компилятора, похоже, одинаковы для GCC) и использовать __attribute__ ((packed)) в структуре в коде ядра.Также убедитесь, что вы используете правильные cl_* типы в вашем коде хоста для обеспечения правильного заполнения.

Хост (GCC):

struct __attribute__ ((packed)) ABC
{
    cl_int a;
    cl_uchar ch[64];
};

Ядро:

struct __attribute__ ((packed)) ABC
{
    int a;
    unsigned char ch[64];
};

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

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

Однако, если вы уже знаете эффект выравнивания на определенном оборудовании, шансыВы также знаете ограничения выравнивания.

Здесь небольшой текст из спецификации об атрибутах.

...