我注意到,为一个代码运行一个线程要比拥有一个线程慢得多,而且我一直在努力地想知道为什么,有人可以帮忙吗?
代码说明:
我有时有一个非常大的数组,我需要以并行方式来处理其中的部分以进行优化,每一行的“一部分”都会在特定线程中循环并进行处理,现在我注意到,如果我只是有一个“部分”,即整个数组和贯穿其中的单个工作线程要比将数组划分并将其作为具有不同线程的单独子数组处理时要快得多。
bool m_generate_row_worker(ull t_row_start,ull t_row_end)
{
for(;t_row_start<t_row_end;t_row_start++)
{
m_current_row[t_row_start]=m_singularity_checker(m_previous_row[t_row_start],m_shared_random_row[t_row_start]);
}
return true;
}
...
//code
...
for(unsigned short thread_indx=0;thread_indx<noThreads-1;thread_indx++)
{
m_threads_array[thread_indx]=std::thread(
m_generate_row_worker,this,
thread_indx*(m_parts_per_thread),(thread_indx+1)*(m_parts_per_thread));
}
m_threads_array[noThreads-1]=std::thread(m_generate_row_worker,this,
(noThreads-1)*(m_parts_per_thread),std::max((noThreads)*(m_parts_per_thread),m_blocks_per_row));
//join
for(unsigned short thread_indx=0;thread_indx<noThreads;thread_indx++)
{
m_threads_array[thread_indx].join();
}
//EDIT
inline ull m_singularity_checker(ull t_to_be_ckecked_with,ull
t_to_be_ckecked)
{
return (t_to_be_ckecked & (t_to_be_ckecked_with<<1)
& (t_to_be_ckecked_with>>1) ) | (t_to_be_ckecked_with &
t_to_be_ckecked);
}
最佳答案
结论:线程不是自动提高程序性能的 Elixir 。
关于您的程序,鉴于您所摘录的内容,我们无法排除上述任何潜在问题。
避免或发现上述问题的一些技巧: