【发布时间】:2019-07-24 02:06:21
【问题描述】:
我正在尝试使用多线程在 C++ 中执行一项非常基本的任务,我注意到使用较少数量的线程运行此代码实际上比使用多线程更快。
我已经尝试切换到线程(...),添加和删除互斥锁,但它仍然是相同的或更慢。
struct threadResults
{
int64_t threadSize;
int64_t sum =0;
int32_t min_val = std::numeric_limits<int32_t>::max();
int32_t max_val = std::numeric_limits<int32_t>::min();
};
void doCalculation(int thread_num, std::vector<int> rand_values, int32_t numPerThread, threadResults* myThreadResult, int remainder)
{
if(remainder!=0&&thread_num==0)
{
for(int i=0;i<numPerThread+remainder;++i)
{
myThreadResult->sum += rand_values[i];
if(myThreadResult->min_val>rand_values[i])
{
myThreadResult->min_val = rand_values[i];
}
if(myThreadResult->max_val<rand_values[i])
{
myThreadResult->max_val = rand_values[i];
}
}
}
else if(remainder!=0&&thread_num!=0)
{
int start = (numPerThread*thread_num)+remainder;
for(int i=start;i<numPerThread+start;++i) {
myThreadResult->sum += rand_values[i];
if (myThreadResult->min_val > rand_values[i]) {
myThreadResult->min_val = rand_values[i];
}
if (myThreadResult->max_val < rand_values[i]) {
myThreadResult->max_val = rand_values[i];
}
}
}
else if(remainder==0)
{
int start = (numPerThread*thread_num);
for(int i=start;i<numPerThread+start;++i) {
myThreadResult->sum += rand_values[i];
if (myThreadResult->min_val > rand_values[i]) {
myThreadResult->min_val = rand_values[i];
}
if (myThreadResult->max_val < rand_values[i]) {
myThreadResult->max_val = rand_values[i];
}
}
}
}
std::future<void> myThreads[num_threads];
auto start = sc::high_resolution_clock::now();
//TODO: Implement multithreaded code to populate the above stat values
for(int i=0;i<num_threads;i++) {
myThreads[i] = async(std::launch::async, doCalculation, i, rand_values, numPerThread, &myThreadResults[i], remainder);
}
for(int i=0;i<num_threads;i++) {
myThreads[i].get();
}
for(threadResults t : myThreadResults)
{
sum += t.sum;
if(t.min_val<min_val)
{
min_val = t.min_val;
}
if(t.max_val>max_val)
{
max_val = t.max_val;
}
}
auto end = sc::high_resolution_clock::now();
我希望使用 1 个线程运行此代码比 2+ 个线程花费更多时间,但事实并非如此。
$ ./sumit 10000000 1 0
Elapsed Time: 101228us
Sum: 101555736
Min: -100000
Max: 100000
Avg: 10.1556
$ ./sumit 10000000 2 0
Elapsed Time: 142738us
Sum: 101555736
Min: -100000
Max: 100000
Avg: 10.1556
【问题讨论】:
-
是的,它大得令人讨厌,很难拆开。
-
@Omnifarious 所说的。此外,完全在(-O3 或发布构建设置)上使用零售优化进行编译。
-
叫我疯了,但
if(remainder!=0&&thread_num==0)块在功能上不等同于随后的else if(remainder!=0&&thread_num!=0)块。就此而言,这三个代码块不是同一组计算吗? -
@selbie - 我放弃了其中奇怪的扭曲逻辑,并编写了一个我认为是 OP 想要完成的程序。
标签: c++ multithreading asynchronous