2014-02-19 4 views
1

Я пытаюсь написать код на C++, но после некоторого поиска в Интернете я обнаружил, что один код на основе OpenCL делает то же самое, что и я, на C++. Но так как это первый раз, когда я вижу код OpenCL, я не знаю, как изменить следующие функции в C++:Изменить функцию OpenCL на C++

const __global float4 *in_buf; 

int x = get_global_id(0); 
int y = get_global_id(1); 

float result = y * get_global_size(0); 

Is «const __global float4 *in_buf» эквивалентно «const float *in_buf» в C++? И как изменить вышеупомянутые другие функции? Может ли кто-нибудь помочь? Благодарю.

ответ

3

В общем, вы должны взглянуть на the OpenCL specification (я предполагаю, что это написано в OpenCL 1.x), чтобы лучше понимать функции, типы и то, как работает ядро.

Специально для Вашего вопроса:

get_global_id возвращает идентификатор текущего рабочего элемента, и get_global_size возвращает общее число рабочих элементов. Так как OpenCL работой пункт примерно эквивалентно одной итерации в последовательном языке, эквивалент OpenCL-х:

int x = get_global_id(0); 
int y = get_global_id(1); 
// do something with x and y 
float result = y * get_global_size(0); 

будет Кассиопеяне:

for (int x = 0; x < dim0; x++) { 
    for (int y = 0; y < dim1; y++) { 
     // do something with x and y 
     float result = y * dim0; 
    } 
} 

Что касается float4 это вектор типа 4 float, примерно эквивалентный C float[4] (за исключением того, что он поддерживает множество дополнительных операторов, таких как векторная арифметика). Конечно, в этом случае это буфер, поэтому подходящий тип будет float** или float[4]* - или еще лучше, просто упакуйте их вместе в буфер float*, а затем загрузите 4 за раз.

Не стесняйтесь игнорировать модификатор __global.

+2

+1; но я бы сказал, что 'float4' более близко эквивалентен' std :: array '- его можно назначить и скопировать. – Angew

+0

Возможно, это эквивалентно встроенной переменной __m128? –

2

const __global float4 *in_buf не соответствует const float *in_buf. В OpenCL используются векторные переменные, например. floatN, где N означает, например, 2,4,8. Таким образом, float4 фактически является struct { float w, float x, float y, float z} с множеством трюков, доступных для экспресс-операций.

get_global_id (0) дает переменный итератор, поэтому по существу заменить каждый get_global_id(dim) с for(int x = 0; x< max[dim]; x++)

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