2015-12-02 6 views
0

Я новичок в OpenCL и читаю книгу OpenCL в действии. Существует простая проблема, которую я не понимаю: как передавать значения и возвращать их из ядер.Передача переменных в ядра

Прежде всего, должны ли мы всегда передавать аргументы по адресам в ядра?

Тогда у меня есть два простых образца ядер ниже. В первом, в то время как вывод является указателем как параметром функции, в теле ядра мы никогда не использовали * output. В то же время в другом ядре * s1 и * s2 используются как параметры функции, и мы фактически присваиваем значение * s1 и * s2 вместо s1 и s2. Может ли кто-нибудь сказать мне, почему в первом ядре значение присваивается выводу (а не * output), а во втором ядре имеет значение, присвоенное * s1 и * s2 (а не s1 и s2).

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

Вот ядра:

1:

__kernel void id_check(__global float *output) { 

    /* Access work-item/work-group information */ 
    size_t global_id_0 = get_global_id(0); 
    size_t global_id_1 = get_global_id(1); 
    size_t global_size_0 = get_global_size(0); 
    size_t offset_0 = get_global_offset(0); 
    size_t offset_1 = get_global_offset(1); 
    size_t local_id_0 = get_local_id(0); 
    size_t local_id_1 = get_local_id(1); 

    /* Determine array index */ 
    int index_0 = global_id_0 - offset_0; 
    int index_1 = global_id_1 - offset_1; 
    int index = index_1 * global_size_0 + index_0; 

    /* Set float data */ 
    float f = global_id_0 * 10.0f + global_id_1 * 1.0f; 
    f += local_id_0 * 0.1f + local_id_1 * 0.01f; 

    output[index] = f; 
} 

2:

__kernel void select_test(__global float4 *s1, 
          __global uchar2 *s2) { 

    /* Execute select */ 
    int4 mask1 = (int4)(-1, 0, -1, 0); 
    float4 input1 = (float4)(0.25f, 0.5f, 0.75f, 1.0f); 
    float4 input2 = (float4)(1.25f, 1.5f, 1.75f, 2.0f); 
    *s1 = select(input1, input2, mask1); 

    /* Execute bitselect */ 
    uchar2 mask2 = (uchar2)(0xAA, 0x55); 
    uchar2 input3 = (uchar2)(0x0F, 0x0F); 
    uchar2 input4 = (uchar2)(0x33, 0x33); 
    *s2 = bitselect(input3, input4, mask2); 
} 

ответ

2

Ваша проблема не с OpenCL, является с самого языка C. Пожалуйста, прочитайте книгу о том, как работает язык C. Это ОЧЕНЬ основной вопрос, о чем вы спрашиваете.

Если у вас есть указатель (output, s1, s2), вы можете получить к нему доступ разными способами. output относится к указателю (адрес), *output относится к значению в первом элементе (или одиночном элементе, указанном указателем), а output[i] относится к значению элемента i.

*output и output[0] такие же, как и *(output+1) и output[1].

+0

Спасибо за ответ. Это дало понять, как работают массивы, когда они вызываются в функции. Извините за основные вопросы, я тоже читаю о C/C++. – mfaieghi