【问题标题】:Sum 1 to 100 int value and then float values in CUDA将 1 和 100 int 值相加,然后在 CUDA 中浮点值
【发布时间】:2021-11-12 11:04:45
【问题描述】:

这是我尝试将 1 到 100 的整数相加,我得到 0 作为输出。

#include <stdio.h>
#include <cuda.h>

__device__ int sum;

__global__ void kernel(){
    sum =0;
    atomicAdd(&sum, threadIdx.x);
    printf("%d",sum);
}

int main(){
    kernel<<<1,100 >>>();
    printf("%d",sum);
    return 0;
}

此外,由于浮点数不支持原子操作,因此我没有任何线索可以找到浮点数的 1 到 100 的总和。

【问题讨论】:

    标签: cuda


    【解决方案1】:

    不分先后:

    • 你不应该像你正在做的那样在内核代码中初始化sum。所有线程都会这样做,并且 CUDA 没有规定特定的线程执行顺序。不要假设所有线程都会在任何线程进入下一个线程之前执行sum = 0; 语句。
    • 您不能直接在主机代码中打印__device__ 变量。 nvcc 应该会警告你
    • 您应该小心使用正确的printf 格式说明符
    • 在打印结果之前,您必须等待内核完成,或强制内核完成。
    • 您可以对float 变量执行atomicAdd。见here
    • 我建议进行适当的 CUDA 错误检查。

    这是解决这些问题的代码。如果您想查看浮动行为,请将 typedef 从 int 更改为 float

    $ cat t1895.cu
    #include<stdio.h>
    
    typedef int mt;
    __device__  mt sum = 0;
    
    __global__ void kernel(){
    
    
      atomicAdd(&sum, threadIdx.x);
      //printf("%f",(float)sum);
    
    }
    
    int main(){
    
      kernel<<<1,100 >>>();
      mt my_result;
      cudaMemcpyFromSymbol(&my_result, sum, sizeof(mt));
      printf("%s\n", cudaGetErrorString(cudaGetLastError()));
      printf("%f\n",(float)my_result);
      return 0;
    }
    $ nvcc -o t1895 t1895.cu
    $ cuda-memcheck ./t1895
    ========= CUDA-MEMCHECK
    no error
    4950.000000
    ========= ERROR SUMMARY: 0 errors
    $
    

    请注意,此代码实际上是对 0-99 而不是 1-100 的值求和。如果您想查看 1-100 的总和,请将线程块大小从 100 增加到 101(即求和 0-100),或者在内核代码中执行 atomicAdd(&amp;sum, threadIdx.x+1);

    【讨论】:

      猜你喜欢
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多