Atomic int неправильно увеличивается? Реализация Intel TBB

Я реализую многопоточную программу для проверки гипотезы Коллатца для диапазона чисел с использованием Intel TBB, и мне трудно понять, почему атомарная переменная <int> count (которая ведет подсчет количества проверенных чисел) не увеличивается правильно .

Для соответствующего кода, приведенного ниже, я использовал небольшой интервал (проверка только чисел 1-10, но проблема масштабируется по мере увеличения интервала), и я последовательно получаю возвращаемое значение 18 для подсчета. Есть идеи?

task_scheduler_init init(4);
atomic<int> count;

void main 
{
tick_count parallel_collatz_start = tick_count::now();
parallel_collatz();
tick_count parallel_collatz_end = tick_count::now();
double parallel_time = 1000 *(parallel_collatz_end - parallel_collatz_start).seconds();
}

void parallel_collatz()
{
    parallel_for
    (
        blocked_range<int>(1,10), [=](const blocked_range<int>&r) 
        { for (int k = r.begin(); k <= r.end(); k++) { collatz(k); } }
    );
}


long long collatz (long long n) 
{
    while (n != 1) {
        if (n%2 == 0)
            n = (n/2);
        else
            n = (3*n + 1);
    }

    if (n == 1) {
        count++;
        return n;
    }
    return -1;
}

person Vance    schedule 18.04.2012    source источник


Ответы (1)


Причина, вероятно, в том, что конструктор использует полуоткрытый диапазон, [1, 10), что означает 1 включительно 10 исключая, поэтому вы проверяете не числа 1-10, а скорее 1-9. Кроме того, вы, вероятно, захотите использовать != вместо <= в своем цикле.

person Mark B    schedule 18.04.2012
comment
Спасибо. Я не знал, что конструктор использовал полуоткрытую дальность! Кроме того, изменение ‹= на != решило мою проблему. - person Vance; 18.04.2012