2010-01-08 1 views
4

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

Спасибо,

+1

Было бы полезно узнать, что вы уже знаете и прочитали. – moritz

+0

В основном я знаю, как использовать потоки в Java и некоторые основные сведения о синхронизации потоков. –

ответ

6

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

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

  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 позволяет ядру управлять количеством потоков. Каждый поток вашей системы потребляет некоторые ресурсы ядра. На переносной, избыточной нити переводят на сокращенный срок службы батареи. На любом компьютере избыточные потоки приводят к снижению производительности. Что означает «избыток»? Нерест 100s нитей на двухъядерной машине. При использовании pthreads вам нужно было явно управлять элементом threadcount, следя за тем, чтобы вы не перегружали систему. Конечно, это очень сложно сделать. С GCD вы просто говорите ядру «Выполняйте этот блок работы, когда у вас есть шанс» - ядро ​​решает, когда у него достаточно свободных ресурсов для запуска кода, - вам не нужно беспокоиться об этом.

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

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

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

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

1

Посмотрите на 'Параллелизм на практике'. Стандартная книга.

1

Herb Sutter пишет ряд хороших статей об этой теме. His site может быть хорошим местом для начала.