所以我想知道是什么原因引起的.可能与缓存有关吗?
voID NetClass::Age_Increment(vector <synapse> & synapses,int k) { int size = synapses.size(); int target = -1; if(k > -1) { for(int q=0,x=0 ; q < size; q++) { if(synapses[q].active) synapses[q].age++; else { if(x==k)target=q; x++; } } /////////////////////////////////////Causing Bottleneck///////////// synapses[target].active = true; synapses[target].weight = .04 + (float (rand_r(seedp) % 17) / 100); //////////////////////////////////////////////////////////////////// } else { for(int q=0 ; q < size; q++) if(synapses[q].active) synapses[q].age++; }}
更新:将两个问题行更改为:
bool x = true;float y = .04 + (float (rand_r(seedp) % 17) / 100);
删除问题.建议可能与内存访问有关吗?
解决方法 每个线程修改内存读取的所有其他读取:for(int q=0,x=0 ; q < size; q++) if(synapses[q].active) ... // ALL threads read EVERY synapse.active...synapses[target].active = true; // EVERY thread writes at leas one synapse.active
这些来自不同线程的同一地址的读写会导致大量的缓存失效,这将导致您描述的症状.解决方案是避免在循环内部写入,并且将写入移动到局部变量的事实再次证明问题是缓存失效.请注意,即使您不写正在阅读的理智字段(活动),您也可能会因错误共享而看到相同的症状,因为我怀疑活动,年龄和体重共享缓存行.
有关详细信息,请参阅CPU Caches and Why You Care
最后要注意的是,对活动和重量的分配,更不用说年龄增量似乎都非常不安全.此类更新的互锁 *** 作或锁定/互斥保护是强制性的.
总结以上是内存溢出为你收集整理的c – 并行计算内存访问瓶颈全部内容,希望文章能够帮你解决c – 并行计算内存访问瓶颈所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)