Объявления структуры OpenCL в разных пространствах памяти - PullRequest
1 голос
/ 05 ноября 2011

В 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;

}

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

EDIT

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

struct r_array
    {
       __local int ndims;
    };

typedef struct r_array real_array;

__ kernel temp(...){

        __local real_array A;
        real_array B;

}

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

Ответы [ 2 ]

2 голосов
/ 05 ноября 2011

Я переписал ваш код как действительный 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;
}

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

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

  • 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

Здесь приведен пример кода .

0 голосов
/ 05 ноября 2011

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

...