【发布时间】:2019-10-10 23:04:32
【问题描述】:
我有一个距离矩阵
D,大小为n,由n和一个常量L作为输入。我需要创建一个向量v包含D中的所有条目,使其值最多为L。这里v必须按特定顺序v = [v1 v2 .. vn]其中vi包含D的第i行中的条目,其值最多为L。每个vi中的条目顺序并不重要。
我想知道有没有一种使用向量、数组或任何数据结构+并行化的快速方法来创建v。我所做的是使用 for 循环,对于大型 n 来说非常慢。
vector<int> v;
for (int i=0; i < n; ++i){
for (int j=0; j < n; ++j){
if (D(i,j) <= L) v.push_back(j);
}
}
【问题讨论】:
-
要考虑改进您的解决方案,我们首先需要一些关于如何计算
D内容的基本信息。就目前而言,您只将每个元素与L比较一次,我认为这是绝对最小值。为了改进这一点,您需要能够知道某些特定值自动意味着可以从测试中排除某些范围(即动态编程)。 -
要考虑的一件事是
D的内存布局和/或您的特定访问模式可能对缓存不友好。遍历大型数据集时的缓存未命中可能会成为巨大的瓶颈。 -
'D' 是使用 eigen 库存储的 'int' 类型的矩阵。 'D' 从文件中读取,速度很快。我有一个巨大的内存,我可以存储一个矩阵 D 最多 n = 200.000
-
好的,如果您不想提供实际信息,这取决于您。请记住,对于处理器中的 L1/L2 缓存而言,拥有“巨大内存”并没有任何帮助,当然也不能作为忽略程序内存布局和访问模式的借口,尤其是在您寻求有关性能问题的建议时.
标签: c++ performance for-loop parallel-processing