Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.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
C# 为什么矩阵逆计算中的中间值在C和CUDA C++之间略有不同? 我编写了两个程序来计算矩阵的逆,第一个程序是C,第二个程序是CUDA C++。这两个程序遵循完全相同的程序,并给出相同的最终结果。然而,当我检查中间步骤中的值时,我发现略有不同的值,小于1e-5相对误差_C#_C++_Cuda_Precision_Matrix Inverse - Fatal编程技术网

C# 为什么矩阵逆计算中的中间值在C和CUDA C++之间略有不同? 我编写了两个程序来计算矩阵的逆,第一个程序是C,第二个程序是CUDA C++。这两个程序遵循完全相同的程序,并给出相同的最终结果。然而,当我检查中间步骤中的值时,我发现略有不同的值,小于1e-5相对误差

C# 为什么矩阵逆计算中的中间值在C和CUDA C++之间略有不同? 我编写了两个程序来计算矩阵的逆,第一个程序是C,第二个程序是CUDA C++。这两个程序遵循完全相同的程序,并给出相同的最终结果。然而,当我检查中间步骤中的值时,我发现略有不同的值,小于1e-5相对误差,c#,c++,cuda,precision,matrix-inverse,C#,C++,Cuda,Precision,Matrix Inverse,这是两个程序的每个代码的一部分 C 库达C++ 我比较了CPU.csv和GPU.csv文件中的值,发现了这些差异 这可能是什么原因?CUDA C++中的计算精度是否比C</P>< P>从下降的大约2/3: [四舍五入]的结果是,对于给定的输入,不能期望不同的数学库计算完全相同的结果。这也适用于GPU编程。为GPU编译的函数将使用英伟达CUDA数学库实现,而为CPU编译的函数将使用主机编译器数学库实现,例如Linux上的GLYBC。因为这些实现是独立的,并且两者都不能保证正确舍入,所以结果通常会略

这是两个程序的每个代码的一部分

C

库达C++

我比较了CPU.csv和GPU.csv文件中的值,发现了这些差异

这可能是什么原因?CUDA C++中的计算精度是否比C</P>< P>从下降的大约2/3:

[四舍五入]的结果是,对于给定的输入,不能期望不同的数学库计算完全相同的结果。这也适用于GPU编程。为GPU编译的函数将使用英伟达CUDA数学库实现,而为CPU编译的函数将使用主机编译器数学库实现,例如Linux上的GLYBC。因为这些实现是独立的,并且两者都不能保证正确舍入,所以结果通常会略有不同


告诉你所有你需要知道的,真的。

如果我在最终结果中发现了差异,我会接受这一点,但最终结果是完全相同的,没有一个数字差异,而中间值略有差异。你输出最终结果的精度是多少?我在两个程序中都使用C中的WriteLine,请注意,CUDA C++是一个C程序的DLL。对不起,我不太熟悉,但是我建议你找到一个方法,尽可能多地输出精度。在C++中,你可以使用它。对于最终结果,你使用C编写数据集。对于中间结果,你使用C编写一个数据集,并且使用C++编写一个数据集。比较来自不同平台或库的浮点结果的唯一有效方法是以二进制形式写出数据,因此在本例中,整个IEEE 753 binary64格式都是二进制的,然后加载这些数据并逐个比较。依赖csv文件会让您任由不同的浮点到字符串转换例程支配,如果您使用Matlab之类的工具来加载和比较结果,则可能需要进行字符串到浮点的转换。决不that@talonmies谢谢你,我很感激这一点,我想我将来会使用它,你能给我一个如何以二进制形式写出数据的参考吗?这个作为起点怎么样?请不要破坏你的帖子,为别人做更多的工作。通过在Stack Exchange网络上发布,您已授予Stack Exchange在下的不可撤销的权利,以分发该内容,即无论您未来的选择如何。根据堆栈交换策略,帖子的非破坏版本是分发的版本。因此,任何故意破坏行为都将恢复原状。如果您想了解有关删除帖子的更多信息,请参阅:
int i, j, i1, n, y, z;
double[,] M = new double[n, n];
double[,] inv = new double[n, n];
for (i = 0; i < n; i++)
    inv[i, i] = 1;
for (i = 0; i < n; i++)
{
    for (j = i + 1; j < n; j++)
        M[i, j] /= M[i, i];
    for (j = 0; j < n; j++)
        inv[i, j] /= M[i, i];
    if (i != n - 1)
    {
        for (i1 = i + 1; i1 < n; i1++)
            if (Math.Abs(M[i1, i]) >= 1e-9)
            {
                for (j = i + 1; j < n; j++)
                    M[i1, j] -= M[i1, i] * M[i, j];
                for (j = 0; j < n; j++)
                    inv[i1, j] -= M[i1, i] * inv[i, j];
            }
        f = new StreamWriter("CPU.csv");
        for (y = 0; y < n; y++)
        {
            for (z = 0; z < n; z++)
                f.Write(M[y, z].ToString() + ",");
            for (z = 0; z < n; z++)
                f.Write(ans[y, z].ToString() + ",");
            f.WriteLine();
        }
        f.Close();
    }
}
for (i = n - 1; i > 0; i--)
{
    for (i1 = 0; i1 < i; i1++)
        if (Math.Abs(M[i1, i]) >= 1e-9)
            for (j = 0; j < n; j++)
                inv[i1, j] -= M[i1, i] * inv[i, j];
}
int i, j;
double v;
double* d_A, * d_B, * d_v, * Z;
size = n * n * sizeof(double);
cudaMalloc(&d_A, size);
cudaMemcpy(d_A, A, size, cudaMemcpyHostToDevice);
cudaMalloc(&d_B, size);
cudaMalloc(&d_v, sizeof(double));
Z = new double[n * n];
Unity <<<1, n>>> (d_B, n);
cudaDeviceSynchronize();
for (i = 0; i < n; i++)
{
    GetVal <<<1, 1>>> (d_A, i * (n + 1), d_v);
    cudaMemcpy(&v, d_v, sizeof(double), cudaMemcpyDeviceToHost);
    if (i != n - 1)
        DivideRow <<<1, n - i - 1>>> (d_A, i * (n + 1) + 1, n - i - 1, v);
    DivideRow <<<1, n>>> (d_B, i * n, n, v);
    cudaDeviceSynchronize();
    cudaMemcpy(Z, d_A, size, cudaMemcpyDeviceToHost);
    cudaMemcpy(B, d_B, size, cudaMemcpyDeviceToHost);
    if (i != n - 1)
    {
        dim3 GridA(1, 1);
        dim3 BlockA(n - i - 1, n - i - 1);
        dim3 GridB(1, 1);
        dim3 BlockB(n - i - 1, n);
        ModifyRow <<<GridA, BlockA>>> (d_A, i, i, i + 1, n - i - 1, n - i - 1);
        ModifyRow <<<GridB, BlockB>>> (d_A, n, i, i, d_B, i + 1, 0, n - i - 1, n);
        cudaDeviceSynchronize();
        cudaMemcpy(Z, d_A, size, cudaMemcpyDeviceToHost);
        cudaMemcpy(B, d_B, size, cudaMemcpyDeviceToHost);
        myfile.open("GPU.csv");
        for (x = 0; x < n; x++)
        {
            for (y = 0; y < n; y++)
                myfile << Z[x * n + y] << ",";
            for (y = 0; y < n; y++)
                myfile << B[x * n + y] << ",";
            myfile << "\n";
        }
        myfile.close();
    }
}
cudaFree(d_v);
for (i = n - 1; i > 0; i--)
{
    dim3 GridB(1, 1);
    dim3 BlockB(i, n);
    ModifyRow <<<GridB, BlockB>>> (d_A, n, i, i, d_B, 0, 0, i, n);
    cudaDeviceSynchronize();
    cudaMemcpy(Z, d_A, size, cudaMemcpyDeviceToHost);
    cudaMemcpy(B, d_B, size, cudaMemcpyDeviceToHost);
}
cudaMemcpy(B, d_B, size, cudaMemcpyDeviceToHost);
cudaFree(d_A);
cudaFree(d_B);