Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 高斯消去并行_Math_Parallel Processing_Cuda_Gpu - Fatal编程技术网

Math 高斯消去并行

Math 高斯消去并行,math,parallel-processing,cuda,gpu,Math,Parallel Processing,Cuda,Gpu,我已经成功地在CUDA中实现了一个用于高斯消去的单线程程序,并希望实现并行性。到目前为止,并行代码如下所示: __global__ void ParallelGaussian(double* A) { int index = threadIdx.x; int stride = blockDim.x; if (index < ROWS) //Skip additional threads { for (unsigned int r = ind

我已经成功地在CUDA中实现了一个用于高斯消去的单线程程序,并希望实现并行性。到目前为止,并行代码如下所示:

__global__ void ParallelGaussian(double* A)
{
    int index = threadIdx.x;
    int stride = blockDim.x;

    if (index < ROWS) //Skip additional threads
    {
        for (unsigned int r = index; r < ROWS; r += stride)
        {
            //Forward elimination to reduce to row echelon form
            for (unsigned int k = r + 1; k < ROWS; ++k)
            {
                double c = -A[(ROWS + 1) * k + r] / A[(ROWS + 1) * r + r];
                for (unsigned int j = r; j < ROWS + 1; ++j)
                {
                    if (r == j)
                        A[(ROWS + 1) * k + j] = 0.0;
                    else
                        A[(ROWS + 1) * k + j] += c * A[(ROWS + 1) * r + j];
                }
            }
        }
    }
}
\uuuuu全局\uuuuuuu无效(双*A)
{
int index=threadIdx.x;
int-stride=blockDim.x;
if(index
我们可以看到,GPU上的代码将1D数组(矩阵)转换为下三角矩阵,然后在CPU上,我将继续反向替换以获得最终结果。在这种方法中没有进行旋转,因为它不是完全需要的,但确实提高了算法的数值稳定性

用一个线程和一个块启动内核可以工作,并将矩阵转换为行梯队形式:

ParallelGaussian << < 1, 1 >> >(dev_a);
a>(dev_a);
但是,如果我想增加线程的数量,比如

ParallelGaussian << < 1, 32 >> >(dev_a);
a>(dev_a);

它将无法生成下三角矩阵。现在,在代码中添加uu syncthreads()调用以同步块中的线程并不能改善这种情况,我也不知道为什么。

考虑一下您的内部循环。每个线程访问
A
,由于
k
j
r
运行到矩阵末尾,因此多个线程可能修改相同的
A[(行+1)*k+j]

当其他线程正在更新该值时,也可能有一些线程正在访问
A[(行+1)*r+j]

一种可能的解决方案是让每个线程累积到单独的结果数组中,然后在最后合并这些结果数组。这是内存密集型的

另一种方法是重新构造它,这样只有一个线程会写入一个特定的值,并将这些值存储在一个新的矩阵中(这样您就不会更改其他线程可能需要的任何值)