写GPU程序的时候尽量幸免使用二级指针吧

前几日抓实验的时候写了一段程序,测试完了后,须求把那段程序从CPU上移植到GPU上。本来想着那活不会太难,大概半天时间就化解了吗,没悟出曾经花了八天多的时光了,磕磕绊绊的还没彻底终结,不过GPU的次第总算已经有个规范了,于是打算抽时间把这几天的血泪经验总括一下,那正是:不!要!使!用!二!级!指!针!!!!!

(平静一下情感~~~)

咱俩先从内部存储器说起啊。每3个内存单元都富含多少个性格,1个是“地址”,1个是“内容”。把内部存款和储蓄器比喻成许多抽屉组成的柜子,那么些内存单元就一定于橱柜里面包车型地铁小抽斗,每种小抽屉有五个天性,二个它能装东西(内容),二是它有个抽屉编号(地址)。比如下边正是二个内存的示意图,每叁个小方格是二个内部存储器单元,青古铜色是它的剧情,鲑鱼红是它的地址:

内部存款和储蓄器示意图

内部存款和储蓄器的地点是定点的,无法改动。比如上边的小方格地址表示为在第几行第几列,我们无奈改变。程序猿能够控制的是内部存款和储蓄器的始末。一种万分的图景正是,假设三个内部存款和储蓄器单元的内容是其他内部存储器的地址,那么它就被誉为指针,比如下图中,左侧的内部存款和储蓄器单元就被叫做指针,因为它的内容,是右手内部存款和储蓄器单元的地址。大家称这种气象为左侧的指针指向了左侧的内存单元。

指针

假设我们随便一点,让2个指南针指向另一个指南针,即所谓的螳螂捕蝉黄雀在后,那么就取得了一个二级指针,如下图所示。以此类推,大家理论上可以定义三级,四级等多元指针(可是具体中小编还没见过如何地点要用到四级指针)

指南针与二级指针

每一本C语言的读本都会讲到指针,而且还会特意阐明指针是损害的,尽量别用它。猜猜为何?因为它太灵活了,指针在内部存款和储蓄器中变来变去,假设程序稍微复杂一点,那么人脑很可能就顾可是来了,说不定哪个指针就改为了被忘记的男女,随处兴风作浪。有个别高级语言已经干脆撤消了指针。然则就如前面说的,指针灵活呀,有个别工作作用用它很有利就能不辱职分了。所以说啊,每二个程序猿须求在灵活性与安全性之间权衡取舍一番。

好,介绍完了背景知识,现在该说说自身遇见的题材了。在用C++写程序的时候定义了3个类Sample,头文件是:

#include”stdio.h”

#include”InstanceList.h”

usingnamespacestd;

classSample

{

public:

Sample();

int* Data;

intAttributesCount;

intAttributesInLastInt;

intIntPerInstance;

intTrueInstanceCount;

intSize;

};

里面有3个分子变量Data,它是叁个int型指针,顾名思义是用来囤积数据的。由于数量很多,直接传内容越发浪费内部存款和储蓄器和时间,所以任何程序中只保留了二个备份。每一遍有函数必要用这么些多少的时候,就传Sample的地方(也正是它的指针)。用萨姆ple的地方读取像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是1个global类型的指针之后,再也无力鲜明Data是何许项目标指针了,只可以假若Data是3个global类型的指针。尽管由于其他原因,那种假诺有99.99%的正确率,不过望着这么多提个醒,一来危险,二来着实令人痛楚啊~

脚下那么些警告并不会影响本身先后的常规运行,但背后还要加新的功效,很不方便人民群众。网上有人涉嫌了一三种有效的消除办法,作者试了没意义,于是这几天花大力气把代码结构改了,删了萨姆ple类,用二个数组代替,整个经过只怕很耗费时间间的。