2015-07-15 4 views
2

До сих пор я реализовал простую программу с парадигмой пула потоков, , в которой у меня есть ряд потоков, работающих по целому ряду задач. Все задачи, доступные одновременно, независимы друг от друга. Для каждой задачи у меня будет некоторый вывод и, как правило, множество задач, сгенерированных из него. (НапримерДинамический пул потоков с GPU

func(a, b): tasks.enque((a+b, b+1), (a*b, b+2)); return sin(a);

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

И с этим я пришел на мой вопрос:. существует ли вешать это сделать какой-то образом straigth вперед, например, с помощью OpenCL
? Интересно, это хорошая идея. Пока я не видел возможности динамически добавлять задачи в очередь в OpenCL , и если бы я сказал: ОК - сначала я вычислил первую очередь и сгенерировал новую очередь, которую я запускаю позже, боюсь, что накладные расходы на копирование памяти между GPU и CPU могут быть настолько большими, что это больше не будет эффективнее для простых вычислений, которые я намереваюсь сделать. Я не уверен, если я могу хранить данные в ОЗУ GPU, или если он извлекается автоматически, и поэтому его необходимо скопировать туда и обратно. (я планирую использовать OpenCL.net)

Спасибо за enlightning меня своими знаниями, для Я Absolutly начинающий с обоими, Многопоточность и графические процессоры

+0

Никогда не делал SMP, что заставляет вас думать, что это хорошая идея для изучения гетерогенных вычислений? Накладные расходы на копирование данных из управляемого C# на GPU - INSANE. Вы только действительно получаете что-то, если у вас есть глубокий конвейер с большим количеством SIMD. Но, учитывая, что у вас нет опыта в SMP, я сомневаюсь, что вы знаете, что означает SIMD. – Aron

+0

Это точно вопрос, как я могу достичь этого глубокого трубопровода. Это своего рода SIMD. Хорошо, это две инструкции (умножение и добавление), и это должно выполняться по всем данным. Но вместо того, чтобы копировать его обратно, я также хочу выполнить ту же задачу снова по результату, до тех пор, пока не будет выполнено som threshhold (заполнено или заполнено память, или порог времени или глубины, который предварительно предопределен). Идея состоит в том, чтобы вычислить длину всех путей между N маршрутными точками, которые я либо могу вычислить за определенное время, или использовать при максимальных перепадах х. – derM

+0

Мне нужны два расчета там: как только стоимость для каждого пути определяется умножением затрат между каждой путевой точкой, а другая - суммированием. Вы можете идти туда и обратно, каждый раз. – derM

ответ

0

С OpenCL 2.0 можно епдиеие ядра из устройство без взаимодействия с хозяином. Посмотрите на OpenCL™ 2.0: Device Enqueue and Workgroup Built-in Functions.

Однако я сомневаюсь, что вы найдете привязки .Net для OpenCL 2.0, насколько мне известно, еще не привязаны к C++.

+0

Выглядит интересно. Проблема в том, что мой компьютер и компьютеры моего университета имеют графику NVIDEA, и кажется , OpenCL2.0 пока недоступен для них. – derM

+0

На Nvidia max OpenCL 1.2, AMD и Intel поддерживают OpenCL 2.0 на GPU и CPU. – doqtor

+0

Связывание C++ было бы невозможно. Interop, не зная, какой компилятор/версия вы используете, возможно только в C. – Aron