首页 > 其他分享 >cuda原子操作

cuda原子操作

时间:2024-03-28 16:25:38浏览次数:26  
标签:__ int void 原子 ++ cuda 操作 sizeof include

如果不用原子操作,在进行计算直方图时会发生计算冲突

d_b[i]为h_a中数字i有几个

下面的代码将h_a全赋值为3,但d_b[3]却为1

#include<iostream>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#define N 10

__global__ void f(int* a , int *b)
{
	int x = blockIdx.x * blockDim.x + threadIdx.x;

	b[a[x]]++;
}

int main()
{
	int h_a[N] , h_b[N]; //d_b[i]为h_a中数字i有几个
	int* d_a, * d_b;

	cudaMalloc((void**)&d_a, N * sizeof(int));
	cudaMalloc((void**)&d_b, N * sizeof(int));
	for (int i = 0; i < N; i++) h_a[i] = 3;

	cudaMemcpy(d_a, h_a, N * sizeof(int) , cudaMemcpyHostToDevice);

	f << <N, 1 >> > (d_a, d_b);
	cudaMemcpy(h_b, d_b, N * sizeof(int) , cudaMemcpyDeviceToHost);

	for (int i = 0; i < N; i++) printf("%d ", h_b[i]);

	return 0;
}

使用共享内存原子操作:

#include<iostream>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#define N 10

__global__ void f(int* a , int *b)
{
	__shared__ unsigned int temp[N];
	int x = blockIdx.x * blockDim.x + threadIdx.x;
	temp[x] = 0;  //将共享内存所有元素清0
	__syncthreads();

	atomicAdd(&(b[a[x]]), 1);  //结果现在在共享内存中
	__syncthreads();

	atomicAdd(&(b[x]), temp[x]); //再将结果复制到结果数组中
}

int main()
{
	int h_a[N] , h_b[N];
	int* d_a, * d_b;

	cudaMalloc((void**)&d_a, N * sizeof(int));
	cudaMalloc((void**)&d_b, N * sizeof(int));
	for (int i = 0; i < N; i++) h_a[i] = 3;

	cudaMemcpy(d_a, h_a, N * sizeof(int) , cudaMemcpyHostToDevice);

	f << <N, 1 >> > (d_a, d_b);
	cudaMemcpy(h_b, d_b, N * sizeof(int) , cudaMemcpyDeviceToHost);

	for (int i = 0; i < N; i++) printf("%d ", h_b[i]);

	return 0;
}

标签:__,int,void,原子,++,cuda,操作,sizeof,include
From: https://www.cnblogs.com/algoshimo/p/18101974

相关文章

  • Java 什么操作会导致cpu过高 java应用cpu过高原因
    top获取占用CPU高的进程IDtop进程pid=26850top显示信息,需要关注的相关信息:loadaverage:反映了任务队列的平均长度。如果此值超过了CPU数量,则表示当前CPU数量不足以处理任务,负载过高%us:用户CPU时间百分比。如果此值过高,可能是代码中存在死循环、或是频繁GC等%sy:系统CPU时......
  • emacs的viper模式中回撤操作
    第一个“回撤”简单,就是简单的往前回退,没有方向。但接着就有了方向,是继续“往前”还是回撤“回撤”的往后呢?在emacs的viper模式中是这么解释的:Vipersupportsmultipleundo:‘u’willundo.Typing‘.’willrepeatundo.Another‘u’changesdirection.第1次......
  • 云原生最佳实践系列 5:基于函数计算 FC 实现阿里云 Kafka 消息内容控制 MongoDB DML 操
    方案概述在大数据ETL场景,将Kafka中的消息流转到其他下游服务是很常见的场景,除了常规的消息流转外,很多场景还需要基于消息体内容做判断,然后决定下游服务做何种操作。该方案实现了通过Kafka中消息Key的内容来判断应该对MongoDB做增、删、改的哪种DML 操作。当Kafka......
  • 支持MacOS苹果操作系统的网卡你用过吗?
    MarvellAQC113以太网控制器支持苹果操作系统(MacOS),进一步扩展搭载了AQC113设备的应用领域。众所周知,苹果操作系统应用生态完善,是业内备受瞩目的巨头级操作系统,其应用领域覆盖了游戏、社交、娱乐、工具,甚至NAS存储、工作站、家用PC及其他嵌入式应用等。MarvellAQC113器件由高性......
  • C语言---文件操作
    1.文件的打开和关闭-----打开 fopen,关闭fcloseintmain(){FILE*fp=fopen("D:/a.txt","r");if(fp==NULL){printf("文件打开失败\n");return-1;}printf("文件打开成功:%p\n",fp);fclose(......
  • java基础操作4——计算三维空间两点之间的绝对距离
    在实际项目中,计算两个坐标点的距离算是比较常见的问题。具体可参考如下文章:https://blog.csdn.net/w10463672p/article/details/136877796但是涉及到三维空间的距离计算,或者准确说是两点的相似度,需要用到欧式距离算法或者其他数学方法。此算法计算的距离衡量的是多维空间中......
  • SAP Fiori开发中的JavaScript基础知识2 - 变量,操作符,值,类型
    1.JavaScript代码示例在介绍JavaScript具体语法前,让我们先看一段在Web应用程序过程中的JS代码片。<!DOCTYPEhtml><html> <head> <metacharset="utf-8"/> <title>FirstJavaScriptApplication!</title> <scriptsrc="js/myExternal.js&q......
  • pgsql 批量操作
    批量写入INSERTINTOjinxudong.movie(name)VALUES('杨戬'),('沉香'),('西游记');doupdateset插入更新upsertonconflict(id)主键或者唯一索引相同存在则执行updateexcluded为虚拟表接受传过来的新值INSERTINTOjinxudong.movie(id,name)VALUES(7,'悟空1......
  • 苹果群控ios群控实时同步操作群控功能描述
    技术原理:苹果群控是一款不需要USB集成器直接通过局域网进行控制传输命令的软件仅需用一台手机当主控设备即可操控上千台手机。无需网络传输命令,只需连接本地路由器,支持连接局域网的同时使用移动数据流量进行上网!(可选择使用WiFi或手机卡流量)功能简介:1.可以手动点击主控设......
  • defrag" 命令的帮助信息,该命令用于对磁盘进行碎片整理操作
    Windows系统中"defrag"命令的帮助信息,该命令用于对磁盘进行碎片整理操作。下面是对其中的参数和选项的翻译:Volumes:/C|/AllVolumes:对每个卷只运行给定操作列表中的首选操作。/E|/VolumesExcept<volumepaths>:在每个卷上执行除了指定的操作外的所有操作。如果例外......