сродства.

я есть образец программы на C для дополнения. Когда я компилирую и запускаю его с GCC, он использует только одно ядро ​​процессора.

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

Я привык компилировать какgcc -O3 malloc.c

Код:

#include <stdio.h>
#include <time.h>
#include <malloc.h>

int main() {
        float *ptr;
        unsigned long long i;

        ptr = (float*) malloc(8000000000 * sizeof(float));

        for(i=0; i<8000000000; i++) {
                ptr[i] = i/10000;
        }

        clock_t tic = clock();

        for(i=0; i<8000000000; i++) {
                ptr[i] = (i/10000)+1.0;
        }

        clock_t toc = clock();

        printf("Elapsed: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);

        return 0;
}
 danglingpointer28 нояб. 2017 г., 10:48
@BasileStarynkevitch, я не был уверен, о чем просил ОП, поэтому я просто поднял вопрос для разъяснения. Если он хочет сделать это во время выполнения, то я согласен с вами, нет смысла использоватьmake.
 el.pescado28 нояб. 2017 г., 10:53
Мне было так же просто, как щелкнуть выключателем, почему бы не включить его по умолчанию?
 Basile Starynkevitch28 нояб. 2017 г., 10:45
@LethalProgrammer:make -j актуально во время сборки, а не во время выполнения
 danglingpointer28 нояб. 2017 г., 10:44
Если вы используете make buildtool, тогда вы можете использовать флаг -j, где вы можете работать одновременно. За 4 ядра можно дать какmake -j4Это то, что вы спрашиваете?
 Basile Starynkevitch28 нояб. 2017 г., 10:44
<malloc.h> не является стандартным и, возможно, не рекомендуется. использование<stdlib.h>

Ответы на вопрос(4)

один поток, и он работает на одном ядре (одновременно).

Посмотрите учебник о темах, в частностиPthreads, чтобы узнать, как работать с потоками. Или вы могли бы использоватьвилка системный вызов, чтобы разбить вашу программу на несколько процессов, с одним потоком каждый.

 Basile Starynkevitch28 нояб. 2017 г., 10:49
Я не думаю, что синхронизация и связь между потоками или процессами просты. Мое мнение таково, что этожесткий.
 Thomas Padron-McCarthy28 нояб. 2017 г., 10:46
@BasileStarynkevitch: правда.
 Basile Starynkevitch28 нояб. 2017 г., 10:40
Это может быть многопроцессная программа, а не многопоточная
 Thomas Padron-McCarthy28 нояб. 2017 г., 11:00
@BasileStarynkevitch: я думаю, что все с тобой согласны. Я думаю, что triplee означает, что вызывать pthread_create легко. Это все остальное, что трудно.
 tripleee28 нояб. 2017 г., 10:46
Создать несколько потоков или процессов (относительно) легко. Сложно то, как разделить работу так, чтобы они действительно могли действовать независимо, но координировать, когда это необходимо.

n (n означает количество ядер) потоков в вашей программе, а затем вы можете установитьCPU близость каждой нити, так что она привязана к конкретномуCPU Core. sched_setaffinity или жеpthread_setaffinity_np это тот, который позволяет установитьCPU сродства.

Попробуйте добавить следующую прагму прямо над вашимfor петли:

#pragma omp parallel for
for(i=0; i<8000000000; i++) {
    ptr[i] = i/10000;
}

И добавить-fopenmp вариант ваших опций сборки, когда вы вызываете gcc. По умолчанию OpenMP создает столько потоков, сколько ядер на вашей машине, и равномерно распределяет рабочую нагрузку между ними.

Вы можете проверить этостатья для получения дополнительной информации об OpenMP.

 Thomas Padron-McCarthy28 нояб. 2017 г., 13:02
Хороший! Это изменило время второгоfor цикл от 8,48 секунды до 1,48 секунды. Это в 5,7 раза быстрее, чего можно ожидать на моем процессоре i7 с 6 ядрами.

чтобы она могла использовать все ядра процессора в Linux.

нетне так волшебно, как вы хотите, чтобы это произошло.Распараллеливание программ является очень сложным предметом и в целом не может быть сделано автоматически. Кстати, параллельные программы могут быть не такими эффективными, как вы хотели бы (быть в курсеЗакон Амдаля).

Тем не менее, вы могли быдизайн а такжекод параллельная программа. Вы могли бы, например, использоватьPosix темы, Осторожно, это сложно! Прочитайте сначала некоторыеУчебник Pthread, Вы не будете уверены, что всеядра будет использоваться (так как они управляютсяядро), но на практике это весьма вероятно. Читайте также осродство процессора.

Вы также можете использоватьOpenMP или жеOpenACC, Вы можете кодировать некоторые из ваших числовых ядер, используяOpenCL, Вы могли бы иметьмногопроцессорной обработки подход (например, разветвление несколькихпроцессы, с помощьюмежпроцессное взаимодействие), возможно, используяMPI, Смотрите также вУменьшение карты подход,0mq библиотека (и многие другие).

Вы могли бы прочитать что-нибудь на OS, напримерОперационные системы: три легкие пьесы, Вы также можете прочитать что-нибудь о системном программировании в Linux, например,Расширенное программирование в Linux (или какая-то более новая книга). Смотрите такжеинтро (2) а такжеСистемные вызовы (2) & Pthreads (7).

Быть в курсе, чтопроектирование, кодирование и отладкапараллельно (или одновременно, илираспределенный) приложениеочень трудно, Примите во внимание стоимость времени разработки (и время, вероятно,лет, необходимые для приобретения соответствующих навыков). ЕстьНет серебряной пули!

(преобразовать существующее реальное последовательное приложение в параллельное не очень реалистично; обычно вам приходится разрабатывать параллельную программу с нуля)

 Peter Cordes20 дек. 2017 г., 14:47
Есть ли-ftree-parallelize-loops=4 все еще работает в gcc? Если это так, он может работать здесь в этом простом случае с постоянными во время компиляции большого числа отключений для циклов.
 Basile Starynkevitch20 дек. 2017 г., 14:48
Вероятно, да, но вы должны попробовать (и ответ может быть конкретная версия компилятора)

Ваш ответ на вопрос