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_histograms добавляются в основной поток в конце.

Вот странная вещь: когда я запускаю программу с одним потоком для определенного размера вычисления, это занимает около 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 как учебный опыт.)

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

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