5

В настоящее время я параллель цикла, подобную этой:Самый простой способ использовать GPU для параллельной цикл

int testValues[16]={5,2,2,10,4,4,2,100,5,2,4,3,29,4,1,52}; 
parallel_for (1, 100, 1, [&](int i){ 
    int var4; 
    int values[16]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; 
    /* ...nested for loops */ 
     for (var4=0; var4<16; var4++) { 
      if (values[var4] != testValues[var4]) break; 
     } 
    /* ...end nested loops */ 
} 

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

Я заинтересован в использовании графического процессора для параллельной обработки задачи. Я читал, что такие смущающие параллельные задачи, как это, могут эффективно использовать современный GPU.

Использование любого языка, что является самым простым способом использования графического процессора для простой параллели для цикла, подобного этому?

Я ничего не знаю о архитектуре графического процессора или собственном коде графического процессора.

+0

Если ваша задача представляет собой какую-либо численную вычислительную задачу, или если вы можете повторно использовать ее в качестве матрицы-математической проблемы, вы можете использовать MATLAB. Новые MATLAB поддерживают как параллельные ('parfor' из Parallel Computing Toolbox), так и матричную математику на графических процессорах Nvidia CUDA. Оба они относительно безболезненны, требуя лишь незначительных изменений в существующем коде MATLAB. –

+0

Дополнительная информация о том, что вы пытаетесь сделать здесь, может быть полезна.Помните, что передача данных из ЦП на графический процессор приводит к значительным накладным расходам, поэтому вычисление графического процессора дает только увеличение производительности, если вы выполняете большую вычислительную работу на единицу входных данных. Вычисление квадрата каждого числа в векторе не является хорошим использованием GPGPU (вряд ли любая работа на единицу данных); вычисление БПФ вектора является хорошим использованием (много работы с небольшими данными). –

+0

У меня есть несколько вложенных циклов, в самом внутреннем цикле я использую индексы цикла для вычисления 16 значений и сравнения их с массивом testValues ​​[]. Не должно быть значительного доступа к памяти. Также я использую карту AMD/ATI (6850). – Flash

ответ

2

как Li-aung Yip сказал в комментариях, самый простой способ использовать графический процессор - это что-то вроде Matlab, которое поддерживает операции с массивами и автоматически (более или менее) перемещает их на GPU. но для этого вам нужно переписать код как чистую матричную операцию.

В противном случае для использования большинства графических процессоров требуется кодирование в CUDA или OpenCL (вам нужно будет использовать OpenCL с картой AMD). даже если вы используете обертку для вашего любимого языка, фактический код, который работает на графическом процессоре, все еще обычно записывается в OpenCL (который выглядит нечетко как C). и поэтому это требует значительного количества обучения/усилий. вы можете начать с загрузки OpenCL из AMD и чтения через документы ...

Обе эти опции требуют изучения новых идей, я подозреваю. что вы действительно хотите, я думаю, это высокий уровень, но все же традиционный, язык, ориентированный на gpu. к сожалению, они, похоже, пока не существуют. единственный пример, который я могу представить, - это theano - вы можете попробовать это. даже там, вам все равно нужно изучить python/numpy, и я не уверен, насколько прочной является реализация theano, но это может быть наименее болезненный путь вперед (поскольку он позволяет «традиционный» подход - использование матриц во многом проще, но некоторые люди, похоже, очень трудно понять, концептуально).

ps Мне не ясно, что gpu поможет вашей проблеме, кстати.

+0

Я решил использовать OpenCL - на самом деле кривая обучения не так уж плоха. Мне было легче, чем бороться с библиотеками, которые пытаются преобразовать существующий код - несколько оберток, которые я смог найти, не удалось довольно быстро и потребовали применения методов программирования GPU. К сожалению, Matlab, похоже, поддерживает CUDA. – Flash

+0

ОК, прохладно. вы звоните из c? я обнаружил, что pyopencl был проще, чем c - вы все еще программируете часть opencl одинаково, но при подготовке отправляемых данных меньше работы. но тогда я больше привык к python, чем c ... –

1

Возможно, вы захотите проверить огонь массива.

http://www.accelereyes.com/products/arrayfire

Если вы используете OpenCL, вам необходимо загрузить отдельные реализации для различных производителей устройств, Intel, AMD и Nvidia.

0

Возможно, вы захотите ознакомиться с OpenACC, который обеспечивает параллелизм через директивы. Вы можете переносить свои коды (C/C++/Fortran) на гетерогенные системы, поддерживая исходный код, который все еще хорошо работает на однородной системе. Взгляните на это введение video. OpenACC не является программированием на GPU, а выражает параллелизм в вашем коде, что может быть полезно для повышения производительности без слишком больших знаний на низкоуровневых языках, таких как CUDA или OpenCL. OpenACC доступен в коммерческих компиляторах из PGI, Cray и CAPS (PGI предлагает новым пользователям бесплатную 30-дневную пробную версию).

Смежные вопросы