OpenCL: рабочие элементы, элементы обработки, NDRange

Мои одноклассники и я сталкиваемся с OpenCL впервые. Как и ожидалось, мы столкнулись с некоторыми проблемами. Ниже я резюмировал проблемы, которые у нас были, и ответы, которые мы нашли. Тем не менее, мыВы не уверены, что у нас все в порядке, поэтому было бы здорово, если бы вы, ребята, могли взглянуть и на наши ответы, и на вопросы под ними.

Почему немы разделили это на отдельные вопросы?

Они частично связаны друг с другом.Мы думаем, что это типичный новичоквопросы. Те однокурсники, с которыми мы консультировались, все отвечалиЧто ж,тот Я не'Я тоже не понимаю ".Рабочие элементы и элементы обработки

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

Рабочий элемент - это ядро, которое выполняется, тогда как элемент обработки - это абстрактная модель, которая представляет собой нечто, что фактически выполняет вычисления. Рабочий элемент - это то, что существует только временно в программном обеспечении, тогда как элемент обработки абстрагирует что-то, что физически существует в оборудовании. Однако, в зависимости от аппаратного обеспечения и, следовательно, в зависимости от реализации OpenCL, рабочий элемент может отображаться и выполняться некоторым компонентом аппаратного обеспечения, который представлен так называемым элементом обработки.

Вопрос 1: Это правильно? Есть ли лучший способ выразить это?

NDRange

Вот как мы воспринимаем концепциюNDRange:

Количество рабочих элементов, которые там представлены, представлено размером NDRange. Обычно это также упоминается как глобальный размер. Однако NDRange может быть одно-, двух- или трехмерным ("ND»):Одномерной задачей было бы некоторое вычисление линейного вектора. Если векторРазмер s равен 64, и есть 64 рабочих элемента для обработки этого вектора, тогда размер NDRange равен 64.Двумерной задачей было бы некоторое вычисление на изображении. В случае изображения 1024x768 размер NDRange Gx будет равен 1024, а размер NDRange Gy будет 768. Это предполагает, что существует 1024x768 рабочих элементов для обработки каждого пикселя этого изображения. Размер NDRange равен 1024x768.Трехмерным примером могут быть некоторые вычисления на трехмерной модели или около того. Дополнительно есть NDRange размер Gz.

Вопрос 2: Еще раз, это правильно?

Вопрос 3: Эти размеры просто для удобства, верно? Можно просто хранить значения цвета каждого пикселя изображения в линейном векторе размераwidth * height, То же самое верно для любой трехмерной проблемы.

Различный

Вопрос 4: Нам говорили, что выполнение ядер (другими словами: рабочие элементы) может быть синхронизировано внутри рабочей группы с использованиемbarrier(CLK_LOCAL_MEM_FENCE); Понял. Нам также (неоднократно) говорили, что рабочие группы не могут быть синхронизированы. Хорошо. Но тогда чтоиспользование?barrier(CLK_GLOBAL_MEM_FENCE);

Вопрос 5: В нашей хост-программе мы указываем контекст, который состоит из одного или нескольких устройств изодин из доступных платформ. Однако мы можем ставить ядра только в так называемую очередь команд, которая точно связана содин устройство (это должно быть в контексте). Опять же: очередь команд связана не с ранее определенным контекстом, а с одним устройством. Правильно?

Ответы на вопрос(1)

Ваш ответ на вопрос