Инициализация многомерного массива: какая польза от многопоточности? - PullRequest
0 голосов
/ 29 мая 2010

скажем, у меня есть следующий код:

char[5][5] array;

for(int i =0; i < 5; ++i)
{
   for(int j = 0; j < 5; ++i)
   { 
       array[i][j] = //random char;
   }
}

Будет ли полезно инициализировать каждую строку в этом массиве в отдельном потоке?

Представьте, что вместо массива 5 на 5 у нас есть 10 на 10? н х н?

Также это делается один раз, во время запуска приложения.

Ответы [ 6 ]

3 голосов
/ 29 мая 2010

Ты шутишь, верно?

Если нет: ответ, безусловно, нет !!!

Вы бы потратили много времени на то, чтобы собрать достаточно синхронизации, чтобы распределить работу через очередь сообщений, плюс знать, что все потоки закончили свои строки и массивы были готовы. Это намного превысило бы время, которое требуется одному ядру ЦП для заполнения 25 байтов известным значением. Так что для почти любой простой инициализации, подобной этой, вы не хотите использовать потоки.

Также следует помнить, что потоки обеспечивают параллелизм , но не ускорение на одноядерном компьютере. Если у вас есть операция, которая должна выполняться синхронно - например, инициализация массива - тогда вы получите значение, только добавив количество потоков до количества доступных ядер ЦП. В теории.

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

2 голосов
/ 29 мая 2010

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

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

1 голос
/ 29 мая 2010

Я сделал что-то похожее, но в моем случае массив 2d представлял пиксели на экране. Я делал довольно дорогие вещи, искажал цвета, вычислял шум Perlin ... При запуске всего этого в одном потоке я получал около 40 кадров в секунду, но когда я добавил подчиненные потоки, отвечающие за вычисление рядов пикселей, мне удалось удвоить этот результат , Так что да, могут быть ситуации, когда многопоточность помогает ускорить все, что вы делаете в массиве, при условии, что то, что вы делаете, достаточно дорого, чтобы оправдать использование нескольких потоков.

Вы можете загрузить живую демонстрацию, в которой вы настраиваете количество потоков, чтобы наблюдать за изменением счетчика fps: http://umbrarumregnum.110mb.com/download/mnd (тест многопоточности - "Noise Demo 3").

1 голос
/ 29 мая 2010

Кроме того, это делается один раз, во время запуска приложения.

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

1 голос
/ 29 мая 2010

Сомнительно, но для некоторой точки n x n, может быть ... но я бы предположил, что это действительно высокий n, и вы, вероятно, уже работали бы с несколькими потоками при обработке этих данных. Помните, что эти потоки будут выполнять обратную запись в ту же область, что также может привести к конфликту в кэше.

Если вы хотите знать наверняка, попробуйте и профиль.

1 голос
/ 29 мая 2010

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

Довольно легко проверить, хотя. Взбейте немного OpenMP и крутите!

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