top показывает, что оба ядра работают на 90-100% во время работы программы.
вопрос о той же программе, которую яранее спрашивал о, Напомним, у меня есть программа со структурой цикла, например:
for (int i1 = 0; i1 < N; i1++)
for (int i2 = 0; i2 < N; i2++)
for (int i3 = 0; i3 < N; i3++)
for (int i4 = 0; i4 < N; i4++)
histogram[bin_index(i1, i2, i3, i4)] += 1;
bin_index
является полностью детерминированной функцией своих аргументов, которая для целей этого вопроса не использует и не изменяет какое-либо общее состояние - другими словами, оно явно возвращается.
Я впервые написал эту программу, чтобы использовать один поток. Затем я преобразовал его, чтобы использовать несколько потоков, таких, что потокn
запускает все итерации внешнего цикла, гдеi1 % nthreads == n
, Таким образом, функция, которая выполняется в каждом потоке выглядит так
for (int i1 = n; i1 < N; i1 += nthreads)
for (int i2 = 0; i2 < N; i2++)
for (int i3 = 0; i3 < N; i3++)
for (int i4 = 0; i4 < N; i4++)
thread_local_histogram[bin_index(i1, i2, i3, i4)] += 1;
и всеthread_local_histogram
s добавляются в основной поток в конце.
Вот странная вещь: когда я запускаю программу с одним потоком для определенного размера вычисления, это занимает около 6 секунд. Когда я запускаю его с 2 или 3 потоками, выполняя точно такой же расчет, это занимает около 9 секунд. Почему это? Я ожидал бы, что использование 2 потоков будет быстрее, чем 1 потока, так как у меня двухъядерный процессор. Программа не использует мьютексы или другие примитивы синхронизации, поэтому два потока должны работать параллельно.
Для справки: типичный вывод изtime
(это в Linux) для одного потока:
real 0m5.968s
user 0m5.856s
sys 0m0.064s
и две темы:
real 0m9.128s
user 0m10.129s
sys 0m6.576s
Код находится наhttp://static.ellipsix.net/ext-tmp/distintegral.ccs
Постскриптум Я знаю, что есть библиотеки, предназначенные именно для такого рода вещей, которые, вероятно, могли бы иметь лучшую производительность, но это был мой последний вопрос, поэтому мне не нужно больше слышать эти предложения. (Кроме того, я хотел использовать pthreads как учебный опыт.)