相关疑难解决方法(0)

在现实代码中混淆时间和空间位置

我正在阅读这个问题,我想更多地询问他展示的代码,即

for(i = 0; i < 20; i++)
    for(j = 0; j < 10; j++)
        a[i] = a[i]*j;
Run Code Online (Sandbox Code Playgroud)

问题是,

  1. 我理解时间局部性,我认为对i和j的引用应该是时间局部性.我对吗?
  2. 我也理解空间局部性,因为我链接答案的问题是对[i]的引用应该是空间局部性.我对吗?
  3. 那个人说,

    "内部循环在访问[i]十次时会调用相同的内存地址,这是我猜的时间局部性的一个例子.但是在上面的循环中是否还有空间局部性?"

    我不同意他的猜测.由[a]生成的引用应该是空间局部性(它们将引用块中的下一个元素).我对吗?

computer-science spatial computer-architecture temporal

13
推荐指数
2
解决办法
2万
查看次数

为什么迭代2D数组行主要比列主要更快?

这是简单的C++代码,用于比较迭代的2D数组行major和column major.

#include <iostream>
#include <ctime>

using namespace std;

const int d = 10000;

int** A = new int* [d];

int main(int argc, const char * argv[]) {
    for(int i = 0; i < d; ++i)
        A[i] = new int [d];

    clock_t ColMajor = clock();

    for(int b = 0; b < d; ++b)
        for(int a = 0; a < d; ++a)
            A[a][b]++;

    double col = static_cast<double>(clock() - ColMajor) / CLOCKS_PER_SEC;

    clock_t RowMajor = clock();
    for(int a = 0; a < …
Run Code Online (Sandbox Code Playgroud)

c++ arrays compiler-construction iteration

9
推荐指数
2
解决办法
9875
查看次数

嵌套循环的顺序是否对速度有影响

假设我有两个数组arrayOne并且arrayTwo在哪里arrayOne.length != arrayTwo.length(假设两个List具有不同的类似情况size()).以下任何一种都提供了速度优势吗?

java arrays performance loops nested-loops

1
推荐指数
1
解决办法
968
查看次数

我何时可以并行使用可变变量来调用函数?

看完一个有趣的讲座后 Phil Trelford

https://www.youtube.com/watch?v=hx2vOwbB-X0

我对通过用数组替换列表以及更一般地使用可变变量来加速我的代码的可能性很感兴趣.所以我做了一个简单的测试:

let xs = [0.0..1000000.00]
let axs = List.toArray xs

let f x = sin (x * x)

List.map f xs // Real: 00:00:00.170, CPU: 00:00:00.187, GC gen0: 5, gen1: 3, gen2: 1

Array.map f axs // Real: 00:00:00.046, CPU: 00:00:00.046, GC gen0: 0, gen1: 0, gen2: 0
Run Code Online (Sandbox Code Playgroud)

通过数组映射比通过列表映射快三倍以上.此时,当调用的函数计算量更大时,我还没有测试速度差异.差异可能仅仅是因为更快地遍历数组中的项目,并且当每次迭代都是计算密集时可能变得无关紧要.

但是,必须存在使用数组或更普遍的可变变量才能产生显着差异的情况.

在更改我的代码以使用数组而不是列表之前,我想更清楚地了解代码并行化时的后果.

一般来说,什么时候可以使用可变变量而不会冒并行代码的问题?是否有一个简单的测试可以让我在并行调用时确定函数的稳健性?

parallel-processing f# mutable

1
推荐指数
1
解决办法
76
查看次数