문제

다음 예 (2 장)에서 Anthony Williams는 표준 축적 기능을 병렬화하려고합니다. 내 질문은 왜 그가 이것을하는지입니다.

   unsigned long const max_threads=(length+min_per_thread-1)/min_per_thread; 

길이를 추가하고 1을 빼는 이유는 무엇입니까? 왜 그냥 :

 unsigned long const max_threads=length/min_per_thread; 

...................................................................................

   template<typename Iterator,typename T>
    struct accumulate_block
    {
           void operator()(Iterator first,Iterator last,T& result)
           {
              result=std::accumulate(first,last,result);
           }
    };


    template<typename Iterator,typename T>
    T parallel_accumulate(Iterator first,Iterator last,T init)
    {
          unsigned long const length=std::distance(first,last);
          if(!length) 
              return init;

          unsigned long const min_per_thread=25;
          unsigned long const max_threads=(length+min_per_thread-1)/min_per_thread; 

          unsigned long const hardware_threads=std::thread::hardware_concurrency();
          unsigned long const num_threads=
          std::min(hardware_threads!=0?hardware_threads:2,max_threads);

         unsigned long const block_size=length/num_threads;   

         std::vector<T> results(num_threads);
         std::vector<std::thread> threads(num_threads-1); 
         Iterator block_start=first;
         for(unsigned long i=0;i<(num_threads-1);++i)
         {
             Iterator block_end=block_start;
             std::advance(block_end,block_size); #6
             threads[i]=std::thread( accumulate_block<Iterator,T>(),     
                              block_start,block_end,std::ref(results[i]));
             block_start=block_end; 
         }
        accumulate_block()(block_start,last,results[num_threads-1]);  
        std::for_each(threads.begin(),threads.end(),
        std::mem_fn(&std::thread::join));

        return std::accumulate(results.begin(),results.end(),init); 
    }
도움이 되었습니까?

해결책

사용의 문제

 unsigned long const max_threads=length/min_per_thread;

정수 부서 중에 사용되는 잘린 반올림으로 인해 발생합니다.

만약에

length = 7
min_per_thread = 5

그 다음에

max_threads = length / min_per_thread = 1

최대 스레드는 실제로 2 여야합니다

length + min_per_thread - 1 = 11

max_threads = (length + min_per_thread - 1) / min_per_thread = 2
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top