2014-01-24 2 views
1

Итак, я написал программу, которая генерирует изображение mandelbrot. Затем я решил написать его таким образом, чтобы использовать определенное количество потоков для его ускорения. Это то, что я придумал:Темы в C++ не генерируют ускорение при обработке изображений mandelbrot

void mandelbrot_all(std::vector<std::vector<int>>& pixels, int X, int Y, int threadCount) { 
    using namespace std; 

    vector<thread> threads; 
    int numThreads = threadCount; 
    for(int i=0; i<numThreads; i++) { 
     threads.push_back(thread (mandelbrot_range, std::ref(pixels), i*X/numThreads, 0, X*(i+1)/numThreads, Y, X)); 
    } 
    for(int i=0; i<numThreads; i++) { 
     threads[i].join(); 
    } 
} 

Намерение разделить обработку на куски и обрабатывать каждую из них в отдельности. Когда я запускаю программу, она принимает число как аргумент, который будет использоваться как количество потоков, которые будут использоваться в программе для этого запуска. К сожалению, я получаю одинаковые времена для любого количества потоков.

Есть ли что-то о потоковом в C++, которое мне не хватает? Должен ли я добавить что-то или шаблонный шаблон, чтобы заставить потоки работать одновременно? Или это то, как я делаю темы просто глупыми?

Я пробовал использовать этот код на малине pi и моем четырехъядерном ноутбуке с такими же результатами.

Любая помощь будет оценена по достоинству.

+3

Начальные потоки стоят немного дороже. Поэтому вы хотите сделать тест, который занимает больше нескольких секунд. Кроме того, если у вас есть мьютекс для защиты данных, он может сериализовать ваши потоки. –

+0

Можете ли вы объяснить, что вы подразумеваете под «мьютексом для защиты данных»? – PoisonRain

+0

Вопрос, аналогичный http://stackoverflow.com/questions/8535404/programming-for-multiple-cores-mandelbrot-set-c –

ответ

1

Я немного опаздываю на этот вопрос, но оглядываясь назад, я помню решение: я программировал на одноядерном малине pi. Одно ядро ​​означает отсутствие ускорения потока.

0

Я думаю, что нереста потоков слишком дорога, вы можете попробовать PPL или TBB. которые оба имеют parallel_for и parallel_foreach, и используют их для прокрутки пикселей вместо использования потоков. они внутренне управляют потоками, поэтому у вас меньше накладных расходов и максимальная пропускная способность.

-1

Не глядя на свой код и играя с ним, трудно точно определить, в чем проблема. Однако есть предположение: некоторые части заданного изображения Мандельброта намного проще вычислять, чем другие. Ваш код разрезает изображение на равные фрагменты по оси x, но большая часть работы (например, 70%) может попасть в один фрагмент. В этом случае лучшее, что вы можете сделать, это скорость на 30%, так как остальная часть потоков по-прежнему должна ждать окончания последнего. Например, если вы работаете с четырьмя потоками и разбиваете изображение на четыре части, третья часть, конечно, выглядит более интенсивной, чем остальные. Конечно, 70% - это просто оценка.

+0

Я бы поделился больше кода, но класс, который я принимаю, имеет строгую политику по размещению кода в Интернете. Я могу опубликовать только минимальный код, необходимый для получения справки. – PoisonRain

0

Решение одной проблемы за раз, почему бы не дать ей попробовать и жестко использовать 2 потока, а затем 3? Запуск потока дорог, однако, если вы начинаете только 2 потока и вычисляете довольно большой Mandelbrot, тогда время начала потока будет относительно нулевым.

До тех пор, пока вы не достигнете 2x и 3x ускорения, у вас возникнут другие проблемы, которые необходимо отлаживать. & решить, отдельно.

 Смежные вопросы

  • Нет связанных вопросов^_^