LINUX.ORG.RU

История изменений

Исправление nanoolinux, (текущая версия) :


void PrimeNumbers::initiate_with_async(const unsigned max)
{
  unsigned head;
  unsigned i;

  numbers_.assign(number_to_index(max)+1,1);

  vector <future <void> > fs;

  for (head=3; head<=max; head+=2) {
    if (numbers_[number_to_index(head)]==1) { // Is prime/unchecked yet
      if (!is_prime(head)) { // Is not prime
        numbers_[number_to_index(head)]=0;
      } else { // Is prime
        fs.push_back(async(launch::async, &PrimeNumbers::mark_non_prime3, *this, head, max));
      }
    }
  };

  for_each(fs.begin(), fs.end(), [] (future <void> &f) {
    f.get();
  });
};

void PrimeNumbers::mark_non_prime3(const unsigned v,const unsigned max)
{
  unsigned n;

  n=v*3;
  while (n<=max) {
    numbers_[number_to_index(n)]=0;
    n+=v*2;
  }
  volatile int i,j; //*
  for(i=0;i<10000;i++) //* 
    for(j=0;j<10000;j++); //*
};

вот такое даёт адское число процессов. если убрать строки со звёздочкой, будет один поток, загружающий одно ядро на 100%. Но это только факты. Я только предполагаю, что анон прав.

п.с. компилил без -O

Исходная версия nanoolinux, :


void PrimeNumbers::initiate_with_async(const unsigned max)
{
  unsigned head;
  unsigned i;

  numbers_.assign(number_to_index(max)+1,1);

  vector <future <void> > fs;

  for (head=3; head<=max; head+=2) {
    if (numbers_[number_to_index(head)]==1) { // Is prime/unchecked yet
      if (!is_prime(head)) { // Is not prime
        numbers_[number_to_index(head)]=0;
      } else { // Is prime
        fs.push_back(async(launch::async, &PrimeNumbers::mark_non_prime3, *this, head, max));
      }
    }
  };

  for_each(fs.begin(), fs.end(), [] (future <void> &f) {
    f.get();
  });
};

void PrimeNumbers::mark_non_prime3(const unsigned v,const unsigned max)
{
  unsigned n;

  n=v*3;
  while (n<=max) {
    numbers_[number_to_index(n)]=0;
    n+=v*2;
  }
  volatile int i,j; //*
  for(i=0;i<10000;i++) //* 
    for(j=0;j<10000;j++); //*
};

вот такое даёт адское число процессов. если убрать строки со звёздочкой, будет один поток, загружающий одно ядро на 100%. Но это только факты. Я только предполагаю, что анон прав.