GPU对数据的操作不可累加

我想当然的认为GPU处理数据时可以共同访问内存,所以对数据的操作是累加的。

事实证明:虽然GPU多个核可以访问同一块内存,但彼此之间没有依赖关系,它们对这块内存的作用无法累加。

先看代码:

#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/iterator/counting_iterator.h>
#include <thrust/for_each.h>

using namespace std;

struct testfunc
{
    float* list;
	int size;

    __host__ __device__
    void operator()(const int& idx) const{
        for(int i=0;i<size;++i){
            list[i]-=(float)0.1;
        }
    }
};

int main(int argc, char* argv[]){

	thrust::device_vector<float> vlist(100,(float)10);
	testfunc fn;
	fn.size=vlist.size();
	fn.list=vlist.data().get();

	thrust::for_each(
		thrust::counting_iterator<int>(0),
		thrust::counting_iterator<int>(0)+11,
		fn
	);

	for (int i=0;i<10;++i){
		cout<<vlist[i]<<" ";
	}
	cout<<endl;

	return 0;
}

这里我在GPU的内存中创建了一个数组vlist,其每个单元值为10。

之后我用了11个核,每个核都对数组vlist的每个元素减0.1,如果结果能够累加,那么运行结束后vlist每个元素的值应该为10-0.1*11=8.9。

但实际结果是:9.9

相当于只保留了一个核的结果……果然是并行啊~

时间: 2024-10-07 06:49:17

GPU对数据的操作不可累加的相关文章

oracle中的数据集合操作

一.数据更新操作 DML语法中主要包括两个内容:查询与更新,更新主要包括:增加数据.修改数据.删除数据.其中这些操作是离不开查询的.         1.增加数据 语法:INSERT INTO 表名称 [(字段名称1, 字段名称2,-)] VALUES(数据1,数据2-..): 注意:     1.对于字符串需要使用""括起来     2.对于时间可以使用to_date()进行转换     3.数字就直接写 范例:向myemp表中插入一条数据 INSERT INTO myemp(emp

JAVASE02-Unit08: 文本数据IO操作 、 异常处理

Unit08: 文本数据IO操作 . 异常处理 * java.io.ObjectOutputStream * 对象输出流,作用是进行对象序列化 package day08; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; /** * java.io.Ob

Meteor:客户端数据变更操作

关于客户端进行数据变更操作,meteor提供了两套机制: 客户端CRUD+服务端deny/alllow 服务端methods CRUD操作的层次是在数据模型级别,而methods的操作层次是在业务级别,这也对应了它们的权限控制级别.个人认为,在客户端直接进行CRUD操作(数据模型级别的操作),表面上灵活很多,但是很难进行权限控制,很容易暴露安全问题,并因此反而增加程序复杂度.因此,客户端对数据的修改,应该全部由methods进行一次业务级别的隔离. 当然,使用collection2或collec

mysql基本认识【关系型数据库和nosql、mysql操作流程和体系,库操作,表操作,数据的操作,字符集的操作,以及php作为client操作数据库】对连接本身没有疑问

1.关系型数据库永久性保存数据的仓库php的变量只是php脚本执行期间,临时性保存变量的空间[使用内存空间临时保存] 关系型数据库:利用二者的关系来描述实体的信息.[利用二维表字段名和字段值来进行描述][关系型数据库根本不是可以使用外键将两个表构建成关联的意思,而是实现描述实体的二维表的形式] nosql:not only sql[sql表示操作关系型数据的语言]所以nosql指的就是非关系型数据库[典型的是键值对型的数据(redis.memcache)][nosql可以视情况添加信息,不需要对

JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作

基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import java.io.IOException; /** * java标准IO(input/output)操作 * 输入流InputStrean:用于从数据源读取数据到程序中 * 输出流OutputStream:用于将数据发送至目标 * * 流划分为:节点流,处理流 * 节点流:又叫做低级流,特点:数据源明确,

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作)

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作) 一.简单说明 使用数据刷新框架: 该框架提供了两种刷新的方法,一个是使用block回调(存在循环引用问题,_ _weak),一个是使用调用. 问题:在进行下拉刷新之前,应该要清空之前的所有数据(在刷新数据这个方法中). 移除正在显示的cell: (1)把字典中的所有的值,都从屏幕上移除 (2)清除字典中的所有元素 (3)清除cell的frame,每个位置的cell的frame都要重新计算 (4)清除可复用的缓存池. 该部分的代码如下: 1

每篇半小时1天入门MongoDB——4.MongoDB索引介绍及数据库命令操作

准备工作 继续连接到mongo C:\Users\zouqi>mongo MongoDB shell version: 3.0.7 connecting to: test 查看数据库和集合 > show dbs demo 0.078GB local 0.078GB myDatabase 0.078GB myTest 0.078GB > use myTest switched to db myTest > show collections persons system.indexes

如何处理大量数据并发操作

文件缓存,数据库缓存,优化sql,数据分流,数据库表的横向和纵向划分,优化代码结构! 锁述的概 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读 A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 不可重复读 A用户读取数据,随后B用户读出该数据并修改,此时A用

利用数据集进行数据访问操作

数据访问有两种不同的方式,一种是用Connection, Command , DataReader来进行数据对数据的操作,另一种是用DataAdapter(适配器)来进行数据操作,而数据则一般放在内存中的数据集合DataSet,这种方式可以在内存中对数据操作,然后在合适的时间再将修改传到数据库. 一. 建立数据集: 1. 在解决方案右键添加新建项,找到数据中的数据集: 2. 在服务器资源管理器里数据连接添加连接: 3. 之后找到数据库里面需要用到的表,选中之后拖拽至右侧数据集里: 这样一个数据集