2012-06-15 2 views
0

Я новичок в OpenCL, и у меня есть проблема. В моей программе мне нужен 2-мерный массив. Я скопировал 1-мерный массив на графическую карту. Поскольку мне не нужен 1-мерный массив, я написал метод, который shoudl инициализирует все значения потребностей. 2-мерный массив должен быть __global --- У меня есть только операции чтения в этом массиве.Глобальный массив OpenCL

Вот мой код

typedef struct{ 
    unsigned char r; 
    unsigned char g; 
    unsigned char b; 
    unsigned char a; 
} ColorRGBA; 

__constant ColorRGBA array[4096]; 

__kernel void marchingCubes(__global unsigned char* output) 
{ 
    // DO SOMETHING WITH array 

} 


__kernel void initValues(__global unsigned char* input){ 
    // FILL array MAKE 1-dimensional to 2-dimensional (4096,4) 
    array = (ColorRGBA*) input; 
} 

При составлении программы OpenCL, я получаю следующее сообщение об ошибке:

:28:8: error: array type 'ColorRGBA __attribute__((address_space(2))) [4096]' is not assignable 
     array = (ColorRGBA*) input; 

Как я могу иметь доступ к видоизмененному массиву в каждом потоке?

Благодаря Glethien

ответ

0

Я не уверен насчет актеров у вас есть, но вы не можете присвоить указатель на весь массив. Вы должны это сделать:

for (int x = 0; x < size_of_input; ++x) 
    { 
    array[x].r = input[x]; 
    array[x].g = input[x]; 
    array[x].b = input[x]; 
    array[x].a = input[x]; 
    } 

Вам нужно будет передать размер входного массива вашей функции.

это предполагает, что ваши входные пиксели находятся в этом порядке по всему массиву. RGBARGBARGBA и т. Д.

+0

вход представляет собой массив длины: 16384 неподписанных символов. Я хочу преобразовать это в массив формы (4096,4) и сохранить его в глобальном массиве. Если я использую ваш путь, не создавал бы массив с формой (0, x, y)? – glethien

+0

@glethien Я внесла некоторые изменения в свой ответ, дайте мне знать, если это то, что вы ищете? –

+0

не очень .... В python я делаю так: self.grid = numpy.load ("./ testData.npy") self.grid = self.grid.reshape ((4096,4)) В исходном вводе каждый блок из 4 является одним ColorRGBA – glethien

0

Я бы не стал напрямую записывать ваши данные - просто обработайте его как 1D-буфер. Вы можете передать row_width в качестве аргумента ядра, а затем вычислить соответствующий индекс с помощью index = y * row_width + x.

+0

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

+0

Ну, продолжайте участвовать и пересматриваете этот вопрос, как только сможете самостоятельно ответить. Рад, что вы нашли решение. – James

Смежные вопросы