Вычисление сумм с использованием многопоточности - PullRequest
4 голосов
/ 15 сентября 2011

Я работаю над программой, которая должна принять 15 000 целых чисел из файла. После считывания значений поток должен создать 10 потоков, каждый из которых отвечает за вычисление суммы их блока (1500 значений каждый). Затем каждый поток напечатает сумму своих значений, а основной поток вычислит сумму из всех 10 потоков.

Я имею в виду, что нужно прочитать все значения и сохранить их в массиве int, используя int для подсчета количества прочитанных значений (назовем его значениями int). Затем я бы разделил это число на число потоков, которые я хотел бы определить, сколько значений в блоке должно иметь каждый поток (назовем его int block). Затем я запускаю поток, перебираю массив (время блока int), увеличивая при этом количество индексов массива, а затем начинаю новый поток, если количество индексов массива не равно последнему индексу массива.

Это правильный взгляд на эту проблему? Есть ли более простой подход? Нам были даны подсказки для использования pthread_create, pthread_join, pthread_exit, pthread_attr_init, pthread_attr_destroy и pthread_setdetachstate. Это моя первая попытка многопоточности, поэтому было бы здорово получить обратную связь о том, где в моем коде я должен инициировать и завершать каждый поток, чтобы он на самом деле был многопоточным и не выполнял отдельный поток несколько раз. Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ: застрял в аргументах командной строки

#include <stdio.h>

int main(int argc, char *argv[]) {
int i;
FILE *fp;
int c;

for (i = 1; i < argc; i++) {
    fp = fopen(argv[i], "r");

    if (fp == NULL) {
        fprint(stderr, "cat: can't open %s\n", argv[i]);
        continue;
    }

    while ((c = getc(fp)) != EOF) {
        putchar(c);
    }

    fclose(fp);
}

return 0;
}

Кажется, я забыл, насколько ужасным я был при вводе / выводе, когда мы освещали этот раздел. Каковы аргументы командной строки для проверки моей программы (prob_5.c) с заданным параметром?

Ответы [ 2 ]

5 голосов
/ 15 сентября 2011

Ваш план звучит хорошо.Если бы я был на вашем месте, я бы попытался выполнить его и вернуться с конкретными проблемами, если вы столкнетесь с какими-либо.нить

Ваша основная нить будет создавать рабочих.Это будет частью цикла, который вы описываете в некоторых деталях.По всей вероятности, рабочие прекратят работу, вернувшись из своей функции потока.

Одна вещь, которую вы не должны ожидать, это ускорение.По всей вероятности, ваша версия с десятью рабочими будет медленнее, чем ее однопоточный эквивалент.Это связано с небольшим размером входного массива и накладными расходами порождающих потоков и последующей синхронизацией.Кроме того, как правильно заметил @Adam Rosenfield в комментариях, общая программа, скорее всего, будет связана с вводом / выводом.

0 голосов
/ 15 сентября 2011

О чем стоит подумать:

1) Как ваш главный поток узнает, что операции суммирования завершены, и данные доступны из всех одновременно работающих потоков? В некоторых проектах, в том числе и в вашем, последний начавшийся поток может быть не последним.

2) Как бы вы рассчитали, чтобы увидеть, есть ли ускорение? С 15000 целых чисел секундомер не пригодится!

3) Вы можете упомянуть, что, если эта операция суммирования, вероятно, будет использоваться как часть более крупного приложения и будет выполняться более одного раза (или одновременно на нескольких входных файлах), создавая 10 потоков при запуске а ожидание суммирования запросов в очереди «производитель-потребитель» (таким образом, создание пула потоков) повысит общую производительность за счет исключения непрерывного создания / завершения потоков. Вы также можете объединить некоторые IntBlocks, но здесь нет особой необходимости в такой оптимизации, потому что:

4) Как уже отмечалось, 15000 целых чисел - это не очень много данных, а суммирование - быстрая операция, поэтому обратите внимание на предупреждения от других авторов о медленном вводе-выводе диска и т. Д.

5) Когда вы запускаете свое домашнее приложение, может быть интересно посмотреть, как оно работает с SSD - может быть, вы можете попросить своего преподавателя / профессора купить вам одно

Rgds, Martin

...