首页 文章

使用mmap分配双2D数组

提问于
浏览
0

我试图使用mmap创建/访问twi不同的(N 2)*(N 2)2D双精度数组,以便多个线程可以查看它们自己的部分并更改它,应用更改以便所有其他线程可以看到 . 这是我有的:

int main(int argc, char *argv[]) {
    int N = atoi(argv[1]);
    int numProcs = atoi(argv[2]);

    int ARRAY_SIZE = (N+2)*(N+2)*sizeof(double);

    double **grid = (double **) mmap(NULL, ARRAY_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
    if (grid == MAP_FAILED) {
        printf("Error mmapping grid\n");
    }
    double **newGrid = (double **) mmap(NULL, ARRAY_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
    if (newGrid == MAP_FAILED) {
        printf("Error mmapping grid\n");
    }

当我运行它,或尝试访问其中的任何内容时,我会遇到分段错误 . 我试图分配内存,用:

for(i = 0; i < N+2; i++) {
    for(j = 0; j < N+2; j++) {
        grid[i][j] = malloc(sizeof(double));
    }
}

for(i = 0; i < N+2; i++) {
    for(j = 0; j < N+2; j++) {
        newGrid[i][j] = malloc(sizeof(double));
    }
}

但我遇到了:错误:从不兼容的类型'void *'分配'double''newGrid [i] [j] = malloc(sizeof(double));

我相信我在这里错过了mmap的工作方式,有人能指出我正确的方向吗?

2 回答

  • 3

    如果N是编译时常量或者编译器支持可变长度数组(VLA),那么您可以简单地执行:

    double (*grid)[N+2] = (double (*)[N+2]) mmap(NULL, ARRAY_SIZE, ...
    
    grid[4][5] = 2.0;  // setting an element
    

    如果N不是常量且编译器不支持VLA,则需要手动偏移:

    double *grid = (double *) mmap(NULL, ARRAY_SIZE, ...
    
    grid[4 * (N + 2) + 5] = 2.0;  // setting the same element using manual offsets
    
  • 2

    数组或数组数组是内存的连续区域 . 使用指针指针的"2d array"不是连续的 .

    让我们看一些“图像”进行比较:

    适当的数组数组在内存中看起来像这样:

    +--------------+--------------+-----+----------------+--------------+-----+------------------+
    | matrix[0][0] | matrix[0][1] | ... | matrix[0][N-1] | matrix[1][0] | ... | matrix[M-1][N-1] |
    +--------------+--------------+-----+----------------+--------------+-----+------------------+
    

    另一方面,使用指针指针的矩阵看起来像这样:

    +-----------+-----------+-----------+-----+
    | matrix[0] | matrix[1] | matrix[2] | ... |
    +-----------+-----------+-----------+-----+
     |           |           |
     |           |           V
     |           |           +--------------+--------------+-----+
     |           |           | matrix[2][0] | matrix[2][1] | ... |
     |           |           +--------------+--------------+-----+
     |           |
     |           V
     |           +--------------+--------------+-----+
     |           | matrix[1][0] | matrix[1][1] | ... |
     |           +--------------+--------------+-----+
     |
     V
     +--------------+--------------+-----+
     | matrix[0][0] | matrix[0][1] | ... |
     +--------------+--------------+-----+
    

    正如你所看到的那样,它们的内存布局是完全不同的,这就是为什么你不能使用另一个 .

相关问题