描绘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%的正确率,不过看正在这么多提个醒,一来危险,二来着实叫丁不快啊~

时这些警告并无会见潜移默化自己先后C语言的正常化运行,但后面还要加新的职能,很无便于。网上有人干了一两种植有效之解决办法,我试了未曾效果,于是当即几乎天花费蛮力气把代码结构改变了,删了Sample类,用一个数组代替,整个经过要不行耗费时间的。