2016-10-19 4 views
2

Я очень новичок в OpenCL (начался сегодня). Мне сложно реализовать код ядра для добавления чисел массива следующим образом: Если A [] = [1,2,3,4,5,6,7,8,9,10], то сумма должна быть суммой [] = [4,10,16];Код ядра OpenCl

i.e, sum[i]=A[i]+A[i+2]; 
    i=i+3; 

Я пробовал следующий код, но он, похоже, не работает.

std::string kernel_code = 
     " void kernel simple_add(global const int* A, global const int* B, global int* C){ " 
     " int x =0;" 
     " int i =get_global_id(0);" 
     " SUM[x]=A[i]+A[i+2];" 
     " i=i+3; 
     " x++;" 
     " } "; 

Я уверен, что это не способ сделать это. Предложения в этом отношении будут оценены.

ответ

1

Вы должны рассчитать i, как если бы рабочий элемент был единственным в наборе. gid - это глобальный идентификатор рабочего элемента, и я должен быть в три раза больше. Вам также не нужно изменять gid или i после их использования. Это не оптимально, но вы получите правильный ответ.

void kernel simple_add(global const int* A, global const int* SUM){ 
    int gid = get_global_id(0); 
    int i = gid * 3; 
    SUM[gid]=A[i]+A[i+2]; 
} 
+0

Большое спасибо! Код дает правильные результаты. После небольшого чтения я понял, что глобальный идентификатор рабочего элемента не нужно явно изменять. Спасибо за поддержку :) – Ijjz