Параллельность - слишком общее понятие, чтобы можно было ответить чем-то конкретным на такой размытый вопрос. Если нужно уметь программировать научные приложения на кластерах, то начинайте изучать MPI. Если требуется то же научно-финансовое, но на мейнфреймах или рабочих станциях, то изучайте что-нибудь на общей памяти: OpenMP, Cilk Plus, Intel TBB или абстракции работы с потоками из QT или boost.
Но это всё "мягкий путь". Можно вместо MPI использовать хардкорно TCP IP, а вместо библиотек на общей памяти - pthreads (для linux). А если предполагается задействование еще и графических ускорителей Nvidia/AMD, то добавочно изучайте CUDA (для Nvidia) или OpenCL(универсально). Причем распараллеливать в смысле ускорителей и процессоров придется очень по-разному.
Но это всё вместе взятое может оказаться и вовсе ненужным, если стоить цель использовать параллельность внутри языка или конкретной платформы. В C#, Java есть внутренние средства управления потоками. Кому мало могут добавить Scala, Node.js - там очень продвинутое управление потоками. И эти знание вообще никак не будут пересекаться с первыми двумя абзацами.
Я использовал 90% из перечисленных технологий. "Лучшей" нет и быть не может - всё зависит от конкретных целей и потребностей. Так что начните просто с основ того, что такое параллельное программирование. Дальше - по потребностям.