首页 > 代码库 > GPU对数据的操作不可累加
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
相当于只保留了一个核的结果……果然是并行啊~
GPU对数据的操作不可累加
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。