У меня есть ядро, которое выполняет две задачи, А затем В.сериализовать рабочие элементы группы в ядре
A распараллеливаются над всеми рабочими элементами, и В являются очень последовательным, так что только первым рабочим элемент выполняет его ,
Каждый рабочий элемент может выполнять часть B, если я могу заставить их выполнить последовательность. Это двумерное ядро, и я хотел бы, чтобы рабочие элементы выполнялись в растровом шаблоне.
Возможно ли это? Одна из идей - это локальная переменная, которую могут обрабатывать все рабочие элементы, а рабочий элемент , который соответствует переменной, будет выполнять и изменять переменную, чтобы она запускала следующий рабочий элемент.
Любые идеи/шаблоны о том, как это сделать?
Спасибо!
Edit:
Вот некоторые псевдо код, как в настоящее время работает моя ядро:
void myKernel(void) {
// perform A task (all work items are active)
barrier(CLK_LOCAL_MEMORY_FENCE);
if (get_local_id(0) == 0 && get_local_id(1) == 0) {
//perform task B
}
}
и вот как мне хотелось бы, чтобы работать:
// 10 x 10 2D kernel
void myKernel(void) {
// perform A task (all work items are active)
barrier(CLK_LOCAL_MEMORY_FENCE);
local activeIndex =0;
while (activeIndex < 100) {
if (get_local_id(0) + 10* get_local_id(1) == activeIndex) {
// perform part of task B
activeIndex++;
}
barrier(CLK_LOCAL_MEMORY_FENCE);
}
}
}
Edit 2: Я пробовал этот код на своем HD 7700, но он был очень медленным. Наверное, я буду придерживаться локальной памяти.
У вас есть пример кода, чтобы показать нам? Ваш вопрос довольно расплывчатый. Что такое B? Многие алгоритмы могут быть эффективно распараллелены, даже если это не всегда очевидно. –
Спасибо, Cicada. Задача B представляет собой арифметический кодер, где состояние кодера в заданном пикселе зависит от предыдущего пикселя и т. Д. Таким образом, он действительно не может быть распараллелен. – Jacko