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