康威生命游戏的cuda内核

康威生命游戏的cuda内核,cuda,parallel-processing,conways-game-of-life,Cuda,Parallel Processing,Conways Game Of Life,我试图计算在运行Conway的GOL时,对于n次迭代的pxq矩阵,将进行的转换次数。例如,给定1次迭代,初始状态为1个闪烁,如下所示。人口不足将导致5次转变,2次出生,1次存活,2次死亡。我已经让它工作了,但是我想把这个逻辑转换成使用CUDA运行。下面是我想要移植到CUDA的内容 代码: static void gol() // call this iterations x's { int[] tempGrid = new int[rows * cols]; /

我试图计算在运行Conway的GOL时,对于n次迭代的pxq矩阵,将进行的转换次数。例如,给定1次迭代,初始状态为1个闪烁,如下所示。人口不足将导致5次转变,2次出生,1次存活,2次死亡。我已经让它工作了,但是我想把这个逻辑转换成使用CUDA运行。下面是我想要移植到CUDA的内容

代码:

    static void gol() // call this iterations x's
    {
        int[] tempGrid = new int[rows * cols]; // grid holds init conditions
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                tempGrid[i * cols + j] = grid[i * cols + j];
            }
        }

        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                int numNeighbors = neighbors(i, j); // finds # of neighbors

                if (grid[i * cols + j] == 1 && numNeighbors > 3)
                {
                    tempGrid[i * cols + j] = 0;
                    overcrowding++;
                }
                else if (grid[i * cols + j] == 1 && numNeighbors < 2)
                {
                    tempGrid[i * cols + j] = 0;
                    underpopulation++;
                }
                else if (grid[i * cols + j] == 1 && numNeighbors > 1)
                {
                    tempGrid[i * cols + j] = 1;
                    survival++;
                }
                else if (grid[i * cols + j] == 0 && numNeighbors == 3)
                {
                    tempGrid[i * cols + j] = 1;
                    birth++;
                }
            }
        }

        grid = tempGrid;
    }

这里有一种方法可以继续:

每个线程对网格的1个元素进行计算 每个线程首先将一个元素从主网格加载到共享内存中 螺纹块边缘上的螺纹还需要加载边界元素 然后,每个线程都可以根据共享内存的内容进行生存计算 然后,每个线程将其结果写回主内存
这里有一种方法可以继续:

每个线程对网格的1个元素进行计算 每个线程首先将一个元素从主网格加载到共享内存中 螺纹块边缘上的螺纹还需要加载边界元素 然后,每个线程都可以根据共享内存的内容进行生存计算 然后,每个线程将其结果写回主内存
您的主要减速将是主内存访问。因此,我建议您根据现有硬件选择更大的线程块大小。256 16x16是跨硬件兼容性的良好选择。这些线程块中的每一个都将计算电路板较小部分的结果-如果使用16x16,它们将计算电路板14x14部分的结果,因为有一个元素边框。使用16x16块计算14x14块而不是16x16块的原因是为了内存读取合并

将电路板分成14x14块;这是你的网格组织,但你认为合适,但最有可能像董事会的宽度/14,董事会的高度/14


在内核中,让每个线程将其元素加载到共享内存中。然后同步线程。然后让中间的14x14元素使用存储在共享内存中的值计算新值,并将其写回全局内存。使用共享内存有助于最小化全局读写。这也是让线程块大小尽可能大的原因-边和角是浪费的全局内存访问,因为在那里获取的值只会被使用1或3次,而不是9次。

您的主要减速将是主内存访问。因此,我建议您根据现有硬件选择更大的线程块大小。256 16x16是跨硬件兼容性的良好选择。这些线程块中的每一个都将计算电路板较小部分的结果-如果使用16x16,它们将计算电路板14x14部分的结果,因为有一个元素边框。使用16x16块计算14x14块而不是16x16块的原因是为了内存读取合并

将电路板分成14x14块;这是你的网格组织,但你认为合适,但最有可能像董事会的宽度/14,董事会的高度/14


在内核中,让每个线程将其元素加载到共享内存中。然后同步线程。然后让中间的14x14元素使用存储在共享内存中的值计算新值,并将其写回全局内存。使用共享内存有助于最小化全局读写。这也是让线程块大小尽可能大的原因-边和角都是浪费的全局内存访问,因为在那里获取的值只会被使用1或3次,而不是9次。

具体需要什么帮助-如何并行化、存储、实际的CUDA编程等想法?抱歉,我应该如何处理并行性?您具体需要什么帮助-如何并行化、存储、实际的CUDA编程等等?对不起,我应该如何处理并行性?