我有一种情况,我需要做一些繁重的计算。我发现细分我的数据然后将其合并在一起是最快的(随着大小的增加,时间增加得更快,所以拆分是合乎逻辑的)。
它应该能够为应用程序提供数据大小,例如一百万个双精度值。
我现在所拥有的是将基于此大小的创建数据发送到某个函数,在计算后将其返回,然后循环返回以将此数据卸载到主向量中。
我想发送 200 个部分,其中一个“最后”部分。例如,给定 size = 1000005 最初将执行此函数 5000 次,然后是最后一个大小为 5 的数据。
int size = 1000000;
int times = size / 200; // 5000
int leftover = size % 200; // 0, this not performed
QVector<double> x(size);
QVector<double> y(size);
x = createData(size);
x = createData(size);
for (int i = 0; i < times; i++)
{
holder = createData(200);
QVector<double> tempx = x.mid(i*200, 200);
QVector<double> tempy = y.mid(i*200, 200);
holder = myfunction(tempx, tempy, 200); // let it now just return `tempy`
for (int j = 0; j < 200; j++)
{
y[i*200 + j] = holder[j];
}
}
// leftover function here, really similar to this part before.
// plotting function here
最后,x
将保持初始化状态,y
进行计算。
由于这些代码部分可以彼此分开运行并且速度至关重要,因此我想使用几个内核。
以下进一步描述了这种情况:
- 这些函数调用是相互独立的,只有当向量完成时,我才想绘制结果。
- 每次通话的完成时间会有很大差异。
- 的数量
times
应该是可变的。
我读过一些关于建议最大线程数是核心数(至少作为起点)的内容,因为使用太多线程可能会减慢进程。考虑到这种情况,排队系统/线程池似乎是有意义的,因为当一个线程有一些简单的工作而其他线程通过更难的工作减慢一切时,不会浪费时间。
虽然在几十个教程中使用一些(通常是 2 个)线程来打印一些消息似乎很容易,但任何人都可以提供更详细的帮助,说明如何返回向量并将这些线程安全地卸载到主函数中,以及如何创建线程池等时间不会浪费吗?
使用 Ubuntu 13.04、Qt 和 C++11x,虽然没关系。