Я также прочитал ваш последний вопрос, и я думаю, вы должны сначала переосмыслить, что вы действительно хотите сделать, и если OpenCL - это действительно способ сделать это.
OpenCL - это API для малой параллельной обработки и хрустания данных. Где каждое ядро (или задача с очередью) работает параллельно во многих данных значений одновременно, поэтому на много порядков превосходит любую последовательную обработку ЦП.
Типичный пример использования OpenCL - это 1 ядро, в котором работают миллионы рабочих элементов. Для более продвинутых приложений может потребоваться несколько последовательностей разных ядер и специальная синхронизация между процессором и графическим процессором.
Но параллелизм никогда не требуется. (В противном случае одноядерный процессор не сможет выполнить задачу, и это никогда не будет. Это будет медленнее, хорошо, но все равно можно его запустить).
Даже если 2 задания необходимо работать одновременно. Время, необходимое будет таким же, одновременно или нет:
Не одновременно случай:
Kernel 1: *
Kernel 2: -
GPU Core 1: *****-----
GPU Core 2: *****-----
GPU Core 3: *****-----
GPU Core 4: *****-----
Параллельный случай:
Kernel 1: *
Kernel 2: -
GPU Core 1: **********
GPU Core 2: **********
GPU Core 3: ----------
GPU Core 4: ----------
В самом деле, является предпочтительным, не одновременно случай, так как по крайней мере, первая задача уже завершена, и дальнейшая обработка может продолжаться.
Что вы хотите делать, насколько я понимаю, одновременно запускают несколько ядер. Так что ядра работают полностью одновременно. Например, запустите 100 ядер (одно и то же ядро или другое) и запустите их одновременно.
Это совсем не подходит для модели OpenCL. И на самом деле он может быть медленнее, чем одиночный поток процессора.
Если каждое ядро независимо от всех остальных, ядро (SIMD или CPU) может быть выделено только для 1 ядра за раз (поскольку у них только 1 ПК), хотя они могут запускать потоки 1k на в то же время.В идеальном сценарии это преобразует ваше устройство OpenCL в пул из нескольких ядер (6-10), которые последовательно сортируют ядра в очереди. И это предполагает, что API поддерживает его и устройство, а также, что не всегда так. В худшем случае у вас будет одно устройство, которое запускает одно ядро и на 99% потрачено впустую.
Примеры вещей, которые можно сделать в OpenCL:
- хруст/обработки данных. Умножение векторов, моделировать частицы и т.д ..
- обработки изображения, обнаружение границ, фильтрация и т.д.
- Видео compresion, издание, поколение
- Raytracing, сложный свет математики и т.д.
- Сортировка
Примеры материала, которые не подходят для OpenCL:
- Atending запрос асинхронные (HTTP, трафика, интерактивные данные)
- ОБРАБОТКА низких объемов данных
- ОБРАБОТКА данные, которые нужны совершенно разная ОБРАБОТКА для каждого типа этого
С моей точки зрения, только реальное использование случае использования нескольких ядер являются последним , и независимо от того, что вы делаете, производительность будет ужасной в этом случае. Вместо этого лучше использовать многопоточный пул.
Огромное спасибо за то, что вы нашли время и ответили, я полностью ценю это, ну, ваш вопрос действительно, зачем мне это делать. ответ на этот вопрос, прямо сейчас я работаю над исследованием, которое объединяет различные модели программирования, такие как CUDA, openMP OpenCL и т. д., чтобы увидеть, как они переключаются между различными задачами, как они масштабируются и как они достигают, когда они работают одновременно задачи, извините за то, что я не очень понимаю, что я пытался сделать, но да, ваш ответ объясняет многое о поведении. Благодаря :) –