C++/CUDA公式打印错误答案

w6lpcovy  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(138)

目前我正尝试使用CUDA打印出一个方程的答案。
这个方程是(x+y)^2 / xy
我得到的输出的一个例子是在这个image附件。

__global__ void proof() {
    int x = 1;
    int y = 1;
    int multi_number = 1000;

    while (true) {
        long eq = ((pow(x + y, 2)) / (x * y));

        if (y >= multi_number) {
            if (x >= multi_number) {
                printf("\nProof is true for all cases.");
                break;
            }
        }

        if (x >= multi_number) {
            x = 1;
            y = y + 1;
        }

        printf("\nEquation being used: (%d", x);
        printf("+%d", y);
        printf(")^2 / %d", x);
        printf("*%d", y);
        printf(" >= 4");
        printf("\n%d", eq); // printing the equations answer

        if (eq < 4) {
            printf("\nProof Failed: %d", x);
            printf(", %d", y);
            break;
        }

        x = x + 1;
    }
}

我目前尝试用多种不同的方式重写方程,但没有成功。
对于未通过的测试(55+55)^2 / 5555,我希望打印4而不是3。
正确答案的示例为(1+1)^2 / 1
1 = 4

gudnpqoy

gudnpqoy1#

总而言之,pow()(至少在CUDA设备代码中)在使用截断时不具备您需要/期望的准确性,我刚刚在这里回答了一个非常类似的问题。
失败的原因是((pow(x + y, 2)) / (x * y))的结果(在点(55,55)处求值)不像您所期望的那样是4,当通过截断转换为long值时,它是3。
根据我的测试,您可以通过更改以下行来解决这个问题:

long eq = ((pow(x + y, 2)) / (x * y));

改为:

long eq = ((x+y)*(x+y)) / (x * y);
myzjeezk

myzjeezk2#

试试这个代码

#include <stdio.h>
    #include <cuda_runtime.h>

   __global__ void calculate(float x, float y, float *result)
   {
*result = (x + y) * (x + y) / (x * y);
   }

 int main(void)
{
float x = 3.0, y = 2.0;
float result;

cudaMalloc((void **)&x, sizeof(float));
cudaMalloc((void **)&y, sizeof(float));
cudaMalloc((void **)&result, sizeof(float));

cudaMemcpy(x, &x, sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(y, &y, sizeof(float), cudaMemcpyHostToDevice);

calculate<<<1,1>>>(x, y, result);

cudaMemcpy(&result, result, sizeof(float), cudaMemcpyDeviceToHost);

cudaFree(x);
cudaFree(y);
cudaFree(result);

printf("The result of the calculation is %f\n", result);

return 0;
    }

相关问题