LINUX.ORG.RU

ЧЯДНТ?

Не учитываешь количество ядер процессора?

Eddy_Em ☆☆☆☆☆
()

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

vertexua ★★★★★
()

Черт, я глянул твой код! У тебя там сплошные mutex_lock/unlock! Да оно даже на двух потоках тупить будет как на одном!!!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

А #if..#else..#endif ты не смог увидеть? Очки прикупи

anonymous
()
Ответ на: комментарий от vertexua

и потоки определяют что не успели со своим изменением и делают его заново

Это ещё почему? Там fetch-and-add, а не compare-and-swap

lor-hater
() автор топика

ЧЯДНТ

Пишешь код, очевидно.

hateyoufeel ★★★★★
()
Ответ на: комментарий от vertexua

Окей. Ну пусть у меня есть чистая функция. Могу я сделать многопоточный map с ней на массиве 0...N так, чтобы от него была польза?

lor-hater
() автор топика
Ответ на: комментарий от lor-hater

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

vertexua ★★★★★
()

Чувак, инкременты лочить мьютексами — это как мух бить из СС-24 вместо мухобойки. Либо спинлоки, либо атомарные операции.

post-factum ★★★★★
()

да этож анонимус протянул свою вонючие кривые грабли к сишечке! сгинь под лавку, дубина

anonymous
()
Ответ на: комментарий от lor-hater

Могу я сделать многопоточный map с ней

// gcc -std=c99 q.c -lm -fopenmp
#include <stdlib.h>
#include <math.h>

#define CNT 100000000

int main(void) {
  double *buf = calloc(sizeof(double), CNT);

  #pragma omp parallel for
  for (int k = 0; k < CNT; k ++) {
    buf[k] = sin(sin(sin(sin(buf[k]))));
  }

  return 0;
}
i-rinat ★★★★★
()

Дело в том, что как только мы увеличиваем кол-во потоков (N), производительность начинает стремительно падать. ЧЯДНТ?]


поди на цпп пишешь?

darkenshvein ★★★★★
()
Ответ на: комментарий от lor-hater

Какая ж это чистая функция. Ты же глобальную переменную меняешь. Я думал ты сделаешь отдельные вычисления над разными данными. Чистая часть do_calc не в счёт, так как математические вычисления в ней срабатывают в тысячи раз быстрее чем одна запись в глобальную переменную. В ней все вычисления на регистрах конкретного процессора, а при записи в глобальную переменную будут частые сбросы кеша всех процессоров

vertexua ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.