cuda float atomic操作

atomic add.用第二个,暂时还没弄明白

#ifdef FLOAT
  #define T float
#else
  #define T int
#endif

#ifdef FORUM
__device__ inline void atomicAdd(float *address, float val){
      int i_val = __float_as_int(val);
      int tmp0 = 0;
      int tmp1;
      while( (tmp1 = atomicCAS((int *)address, tmp0, i_val)) != tmp0)  {
              tmp0 = tmp1;
              i_val = __float_as_int(val + __int_as_float(tmp1));
      }
}
#else
__device__ inline float atomicAdd(float* address, float value){
  float old = value;  
  float ret=atomicExch(address, 0.0f);
  float new_old=ret+old;
  while ((old = atomicExch(address, new_old))!=0.0f){
    new_old = atomicExch(address, 0.0f);
    new_old += old;
  }
  return ret;
};
#endif

atomic min

__device__ float fatomicMin(float *addr,float value){
          float old = *addr, assumed;
          if(old<=value) return old;
          do {
                     assumed = old;
                     old = atomicCAS((int*)addr, __float_as_int(assumed), __float_as_int(MIN(value, assumed)));
          }while(old!=assumed);
          return old;
};

 

转载于:https://www.cnblogs.com/redips-l/p/6952414.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CUDA中的原子操作atomic operation)是一种能够确保多个线程访问共享内存时的数据一致性的机制。原子操作可以保证某个特定内存位置的读取、修改或写入操作不会被其他线程中断,从而避免数据竞争问题。 在CUDA中,原子操作是通过特殊的函数来实现的,这些函数使用了硬件级别的原子指令。CUDA提供了不同类型的原子操作,如原子加法、原子减法、原子与、原子或等等。这些原子操作可以应用在不同的数据类型上,包括整型、浮点型和指针类型。 使用原子操作时需要注意以下几点: 1. 原子操作可能会引起较高的开销,因为它们需要保证多个线程之间的同步。因此,只有在必要时才应该使用原子操作。 2. 原子操作仅适用于共享内存,不能用于全局内存。 3. 原子操作不能保证全局的顺序一致性,只能保证特定内存位置的一致性。 下面是一个示例代码,展示了如何在CUDA中使用原子操作进行加法: ```cpp __global__ void atomicAddKernel(int* data) { int tid = threadIdx.x + blockIdx.x * blockDim.x; atomicAdd(data, tid); } int main() { int data = 0; int* dev_data; cudaMalloc((void**)&dev_data, sizeof(int)); cudaMemcpy(dev_data, &data, sizeof(int), cudaMemcpyHostToDevice); atomicAddKernel<<<1, 256>>>(dev_data); cudaMemcpy(&data, dev_data, sizeof(int), cudaMemcpyDeviceToHost); cudaFree(dev_data); printf("Result: %d\n", data); // 输出结果应为 32640 return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值