2014-10-09 5 views
1

Я пытаюсь запустить приложение сложения векторов, где мне нужно запускать несколько ядер одновременно, , поэтому для одновременного запуска ядра кто-то в моем последнем вопросе посоветовал мне использовать несколько командных очередей. , который я м определения массиваКомандная очередь OpenCL для Concurrent NDKernal Launch

context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &err); 
    for(i=0;i<num_ker;++i) 
    { 
queue[i] = clCreateCommandQueue(context, device_id, 0, &err); 
    } 

Я м получаю «команду, заканчивающуюся сигналом 11» ошибки некоторые, где вокруг кода выше.

им с помощью цикл для запуска ядра и данных En-очереди слишком

for(i=0;i<num_ker;++i) 
{ 
err = clEnqueueNDRangeKernel(queue[i], kernel, 1, NULL, &globalSize, &localSize, 
                  0, NULL, NULL); 
} 

Дело в том, я не уверен, где ми пойдет не так, я видел где-то, что мы можем сделать массив команд очередей, так Thats почему im использует массив. Другая информация, когда я не использую цикл A for, просто вручную определяя несколько очередей команд, он отлично работает.

ответ

2

Я также прочитал ваш последний вопрос, и я думаю, вы должны сначала переосмыслить, что вы действительно хотите сделать, и если 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, трафика, интерактивные данные)
  • ОБРАБОТКА низких объемов данных
  • ОБРАБОТКА данные, которые нужны совершенно разная ОБРАБОТКА для каждого типа этого

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

+0

Огромное спасибо за то, что вы нашли время и ответили, я полностью ценю это, ну, ваш вопрос действительно, зачем мне это делать. ответ на этот вопрос, прямо сейчас я работаю над исследованием, которое объединяет различные модели программирования, такие как CUDA, openMP OpenCL и т. д., чтобы увидеть, как они переключаются между различными задачами, как они масштабируются и как они достигают, когда они работают одновременно задачи, извините за то, что я не очень понимаю, что я пытался сделать, но да, ваш ответ объясняет многое о поведении. Благодаря :) –