C++形容GPU程序的时节尽量避免使用二级指针吧

前面几天举行尝试的下写了同等段落先后,测试好后,需要将立即段先后由CPU上移植到GPU上。本来想在即生活不见面极其为难,可能半天时间纵弄定了咔嚓,没悟出已经花了三龙多的日了,磕磕绊绊的尚并未彻底结束,不过GPU的次序总算已经出只规范了,于是打算抽时将立即几乎上的血泪经验总结一下,那就算是:不!要!使!用!二!级!指!针!!!!!

(平静一下心境~~~)

咱先由内存说由吧。每一个内存单元都带有两个属性,一个凡“地址”,一个是“内容”。把内存比喻成多抽屉组成的柜子,那一个内存单元就相当给橱柜中的小抽斗,每个微抽斗有有限独特性,一个它们亦可弄虚作假东西(内容),二凡是它发只抽屉编号(地址)。比如下面就是是一个内存的示意图,每一个稍微方格是一个内存单元,浅蓝是它的内容,深蓝是她的地方:

内存示意图

内存的地方是一贯的,没法改变。比如上面的小方格地址表示也于第几履行第几列,我们无奈改。程序猿可以决定的是内存的内容。一种特殊之景就是是,如果一个舅存单第一的情是别的内存的地址,那么它们便于称为指针,比如下图被,左边的内存单元就受号称指针,因为它们的始末,是右内存单冠之地址。我们遂这种气象也左的指针指于了右的内存单元。

指针

如我们随便一点,让一个指针指为其它一个指南针,即所谓的螳螂捕蝉黄雀在后,那么尽管拿走了一个二级指针,如下图所显示。以此类推,我们理论及可以定义三级,四层当系列指针(不过具体中本人还并未见了啊地方如果用到四级指针)

指南针与二级指针

每一样遵照C语言的课本都见面讲话到指针,而且还会见专门声明指针是伤的,尽量别用它们。猜猜为什么?因为它太巧了,指针在内存中变来变去,如果程序稍微复杂一点,那么人脑很可能就顾不过来了,说不定哪个指针就改为了给忘记的儿女,到处惹是生非。有些高级语言就干脆取消了指针。不过即使比如前说之,指针灵活呀,有些工作用它们那个方便就能够好了。所以说呢,每一个程序猿需要在灵活性和安全性之间权衡取舍一番。

哼,介绍完了背景知识,现在该说说自赶上的问题了。在用C++写程序的时节定义了一个类Sample,头文件是:

#include”stdio.h”

#include”InstanceList.h”

usingnamespacestd;

classSample

{

public:

Sample();

int* Data;

intAttributesCount;

intAttributesInLastInt;

intIntPerInstance;

intTrueInstanceCount;

intSize;

};

里起一个分子变量Data,它是一个int型指针,顾名思义是因此来储存数据的。由于数量多,直接招内容特别浪费内存和岁月,所以任何程序中才保留了一个备份。每次来函数需要用这些多少的早晚,就传Sample的地方(也尽管是它们的指针)。用Sample的地方读博像IntPerInstance这样的变量的下,它就是指针,但如小心,读取Data的时节,它就成了二级指针了。

虽说下了二级指针,但本身处理的较小心,程序在CPU上能够正常运作,不过移植到GPU的时候,运行一下纵应运而生了段错误(段错误的意是,我的指针指为了先后不可知利用的内存):

段错误

何以会这样为?因为使用GPU的时候,程序的内存包括个别片段,一部分位居CPU当中,一部分身处GPU中游,而出于CPU和GPU是少片独立的设施,他们之指针是勿能够因为对方的地址的,比如下图的景,就断禁止。

禁止CPU和GPU之间的指针

故而,本来可以的先后,因为指针的原由,就可能发生各种段子错误。说及这里,其实就说知道了在描绘GPU程序的上,“使用指针容易吸引错误”,但问题里怎么强调是二级指针的题材吗?

以在GPU当中,内存还细分为global memory和shared
memory,每次用指针的时还设规定是global还是shared类型的。虽然编译器从二级指针定义的地方,可以非常方便之知她自己是哪种类型的,不过它们对的一级指针随时都或发生变动,很麻烦检查出来到底是呀指针,于是编译器就设报警告了,就比如下:

警戒,强制默认是global memory

拥有这些报警告的地方,都是坐用了samplepointer->Data[address]这般的语句。编译器确定samplepointer是一个global类型的指针之后,再为无力确定Data是什么项目的指针了,只好借用设Data是一个global类型的指针。虽然由于别的原因,这种假设有99.99%之正确率,不过看在如此多提个醒,一来危险,二来着实让人口难受啊~

手上这些警告并无会见潜移默化我先后的正常运转,但后还要加新的效能,很无便宜。网上有人提到了一两种植中之解决办法,我尝试了无效果,于是马上几乎龙花费好劲把代码结构改变了,删了Sample类,用一个数组代替,整个经过还是坏耗费时间的。