Параллельное и параллельное программирование - PullRequest
4 голосов
/ 08 января 2010

Я планирую расширить свои знания о параллельном и параллельном программировании. Может ли кто-нибудь помочь мне найти онлайн-ресурсы?

Спасибо

Ответы [ 3 ]

6 голосов
/ 08 января 2010

Если вы используете систему на основе POSIX (Linux, FreeBSD, Mac OS X и т. Д.), Вам нужно проверить pthreads (ссылка на учебник). Pthreads существует уже давно и является стандартом де-факто для параллельного программирования на платформах на основе POSIX.

Однако есть новичок, известный как Grand Central Dispatch (ссылка на учебник). Технология была разработана Apple (в Snow Leopard) в попытке решить некоторые из утомительных проблем, связанных с многопоточным и многопоточным программированием в целом. В частности:

  1. Блоки (анонимные функции) введены в язык C (расширение C ++ и Objective-C). Это позволяет полностью избежать использования контекстных структур. В примере (интенсивно использующем псевдокод) вы можете написать что-то вроде этого, используя pthreads:

    typedef struct { int val1; int val2; } context;
    
    int main(){
            int firstval = 5;
            int secondval = 2;
            context *c = malloc(sizeof(context));
            c->val1 = firstval;
            c->val2 = secondval;
            create_new_thread(context, myFunct);
    }
    void myFunct(context *c){
            printf("Contrived example %d %d", c->val1, c->val2);
    }
    

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

    int main(){
            int firstval = 5;
            int secondval = 2;
            dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
            dispatch_async(queue, ^{
                                    printf("Contrived example %d %d", firstval, secondval);
            });
    }

Обратите внимание, насколько это было проще! Нет контекста, даже не отдельная функция.

  1. GCD позволяет ядру управлять счетчиком потоков. Каждый поток в вашей системе потребляет некоторые ресурсы ядра. На портативном устройстве избыточные потоки приводят к сокращению срока службы батареи. На любом компьютере избыточные потоки приводят к снижению производительности. Что означает «избыток»? Нерест сотен нитей на 2-ядерном компьютере. При использовании pthreads вам приходилось явно управлять количеством потоков, следя за тем, чтобы не перегружать систему. Конечно, это очень сложно сделать. С GCD вы просто говорите ядру: «Выполните этот блок работы, когда у вас есть такая возможность» - ядро ​​решает, когда у него достаточно свободных ресурсов для выполнения фрагмента кода - вам не нужно об этом беспокоиться.

  2. Помимо обеспечения отличной базовой поддержки многопоточности, GCD также позволяет вашей программе взаимодействовать с «источниками» через блоки. Таким образом, вы можете поставить дескриптор файла в очередь и сказать GCD «запустить этот блок кода, когда появятся новые данные для чтения». И поэтому ядро ​​позволит вашей программе бездействовать до тех пор, пока не поступит достаточно большое количество данных, а затем автоматически поставит в очередь ваш блок!

И я лишь коснулся того, что может сделать GCD. Это действительно удивительная технология, и я настоятельно рекомендую вам ознакомиться с документами . В настоящее время он доступен в Mac OS X и FreeBSD и имеет открытый исходный код, поэтому, если вы хотите, чтобы он работал в Linux, вы можете его портировать:).

Если вы ищете необработанную мощность для параллельных приложений, Apple разработала еще одну замечательную технологию (также для Snow Leopard) под названием OpenCL , которая позволяет вам использовать возможности графического процессора в очень простой C-подобный (это почти точно C с несколькими оговорками) язык. У меня не было большого опыта с этим, но из всего, что я слышал, он прост в использовании и очень мощный. OpenCL является открытым стандартом , с реализациями в Mac OS X и Windows.

Итак, подведем итог: pthreads для всех систем на основе POSIX (это некрасиво, но это стандарт де-факто), GCD для Mac OS X и FreeBSD и OpenCL для параллельных приложений, где вам нужны все сила, которую вы можете получить!

1 голос
/ 08 января 2010

Херб Саттер пишет много хороших статей на эту тему. Его сайт может быть хорошим местом для начала.

1 голос
/ 08 января 2010

Взгляните на «Параллелизм на практике». Стандартная книга.

...