Могу ли я выполнить две функции одновременно? - PullRequest
5 голосов
/ 28 ноября 2011

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

Я изучаю C, и я написал это:

#include <stdlib.h>
#include <stdio.h>

int comp(const char *a, const char *b) {
  return *a - *b;
}

int main() {
  char str[] = "Hello, world! I'm learning C and it's awesome!";
  qsort(str, sizeof(str) - 1, sizeof(char), comp); // -1 because of NUL-terminator.
  puts(str);
  return 0;
}

Однако, когда я хочу отсортировать несколько очень больших массивовЭто может занять некоторое время.Мой компьютер имеет несколько процессорных ядер, поэтому я хочу воспользоваться этим.Это возможно?Может ли код работать параллельно и как мне это сделать?


PS Я знаю, что должен профилировать код перед его оптимизацией, но сейчас предположим, что это очень медленная операция.

Ответы [ 4 ]

5 голосов
/ 28 ноября 2011

То, что вы ищете, называется threading . В Интернете существует множество ресурсов и учебных пособий, которые помогут вам начать распараллеливание кода.

0 голосов
/ 28 ноября 2011

Прежде чем прибегнуть к параллелизму, вы должны убедиться, что ваш алгоритм работает максимально быстро, и это зависит от того, что именно вы сортируете. Например, если вы сортируете числа, которые занимают ограниченный диапазон, вы можете использовать сортировку O (N). В противном случае алгоритм O (NlogN), такой как MergeSort, будет работать.

Предположим, вы выбрали MergeSort. Тогда, даже если это O (NlogN), в нем все же может быть место для большого постоянного фактора ускорения, что вам следует сделать. Вот как я это делаю.

Это сделано, предположим, у вас есть 4 ядра. Затем вы можете просто разбить набор данных на 4 примерно равных сегмента и отсортировать их параллельно, по одному на ядро. Затем вы можете закончить с двумя O (N) проходами, чтобы объединить результаты.

0 голосов
/ 28 ноября 2011

Да, код может выполняться параллельно, используя несколько потоков или несколько процессов.Другой формой параллелизма является SIMD , где одна и та же операция выполняется параллельно с несколькими наборами операндов.

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

0 голосов
/ 28 ноября 2011

Вы можете начать смотреть на потоков , но это считается сложной темой. Существуют также библиотеки, которые помогают выполнять некоторые вещи параллельно, например OpenMP .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...