Объявления структуры OpenCL в разных областях памяти

Каковы будут последствия и различия между следующими объявлениями структур в OpenCL. А если они незаконны, то почему?

struct gr_array
{
    int ndims;
    __global m_integer* dim_size;
    __global m_real* data;
};
typedef struct gr_array g_real_array;

struct lr_array
{
    int ndims;
    __local m_integer* dim_size;
    __local m_real* data;
};
typedef struct lr_array l_real_array;

__ kernel temp(...){

        __local g_real_array A;
        g_real_array B;

        __local l_real_array C;
        l_real_array D;

}

Мой вопрос: где будут размещены структуры (и члены)? кто может получить к ним доступ? И это хорошая практика или нет?

РЕДАКТИРОВАТЬ

как насчет этого

struct r_array
    {
       __local int ndims;
    };

typedef struct r_array real_array;

__ kernel temp(...){

        __local real_array A;
        real_array B;

}

если рабочий элемент изменяет ndims в структуре B, видно ли это изменение другим рабочим элементам в рабочей группе?


person Community    schedule 05.11.2011    source источник


Ответы (2)


Я переписал ваш код как действительный CL или, по крайней мере, CL, который будет компилироваться. Здесь:

typedef struct gr_array {
    int ndims;
    global int* dim_size;
    global float* data;
} g_float_array;

typedef struct lr_array {
    int ndims;
    local int* dim_size;
    local float* data;
} l_float_array;

kernel void temp() {
    local g_float_array A;
    g_float_array B;

    local l_float_array C;
    l_float_array D;
}

Один за другим, вот как это разбивается:

  • A находится в локальном пространстве. Это структура, состоящая из одного int и двух указателей. Эти указатели указывают на данные в глобальном пространстве, но сами размещаются в локальном пространстве.

  • B находится в личном пространстве; это автоматическая переменная. Он состоит из int и двух указателей, указывающих на объекты в глобальной памяти.

  • C находится в локальном пространстве. Он содержит int и два указателя на содержимое в локальном пространстве.

  • D, вы, вероятно, можете догадаться в этот момент. Он находится в частном пространстве и содержит int и два указателя, которые указывают на содержимое в локальном пространстве.

Я не могу сказать, предпочтительнее ли это для вашей проблемы, поскольку вы не описали, чего пытаетесь достичь.

РЕДАКТИРОВАТЬ: я понял, что не ответил на вторую часть вашего вопроса - кто может получить доступ к полям структуры.

Ну, вы можете получить доступ к полям в любом месте, где переменная находится в области видимости. Я предполагаю, что вы думали, что поля, которые вы пометили как глобальные в g_float_array, находились в глобальном пространстве (локальное пространство для l_float_array). Но они просто указывают на вещи в глобальном (или локальном) пространстве.

Итак, вы бы использовали их так:

kernel void temp(
            global float* data, global int* global_size,
            local float* data_local, local int* local_size,
            int num) 
{
    local g_float_array A;
    g_float_array B;

    local l_float_array C;
    l_float_array D;

    A.ndims = B.ndims = C.ndims = D.ndims = num;

    A.data = B.data = data;
    A.dim_size = B.dim_size = global_size;

    C.data = D.data = data_local;
    C.dim_size = D.dim_size = local_size;
}

Кстати, если вы взламываете CL на Mac с запущенным Lion, вы можете скомпилировать файлы .cl с помощью «автономного» компилятора CL, что немного упрощает эксперименты с подобными вещами. Он находится здесь:

/System/Library/Frameworks/OpenCL.framework/Libraries/openclc

Пример кода здесь.

person James    schedule 05.11.2011
comment
Спасибо за ответ. Итак, если я правильно понимаю в структуре C, если переменная ndims изменяется одним потоком, то изменение будет видно всем потокам в рабочей группе. правильно? и я добавил один вопрос. Можешь взглянуть на это? - person ; 06.11.2011
comment
Что касается компилятора, на самом деле я написал небольшой компилятор, который может тестировать исходный код OpenCL, считывать его и собирать двоичный файл, чтобы проверить, все ли в порядке. Моя проблема заключалась в том, что на самом деле означает код. - person ; 06.11.2011
comment
Да, так как C находится в локальной памяти, он используется всеми рабочими элементами в рабочей группе. Любое изменение в C будет видно всем этим элементам, но применяются обычные правила синхронизации внутри рабочей группы. - person James; 07.11.2011
comment
Извините за задержку, но я дал вам принятый ответ, который вы заработали. - person ; 08.11.2011

Скорее всего, это не сработает, потому что текущие GPU имеют разные объемы памяти для ядер OpenCL и для обычной программы. Вы должны делать явные вызовы для передачи данных между обоими пространствами, и это часто является узким местом программы (поскольку пропускная способность видеокарты PCI-X довольно низкая).

person Basile Starynkevitch    schedule 05.11.2011
comment
Я думаю, вы меня неправильно поняли, все структуры находятся в коде OpenCL (файлы .cl или файлы ядра). например B работает нормально. Я могу прикрепить массив (и информацию о массиве) с хоста (выделенного в глобальном масштабе) к ядру и реконструировать его в ядре. Тогда я могу использовать его, как я хочу. Меня просто интересуют A, C и D. - person ; 05.11.2011