cuda基本问题

[table=98%]
[tr][td]想问问,在cuda-z中
[/td][/tr]
[tr][td][attach]3210[/attach]
那个total constant是个什么参数??
[/td][/tr]
[tr][td][attach]3211[/attach]
[/td][/tr]
[tr][td]
还有在GPU里面好像有比share memory还要快的一级寄存器,怎么可以定义一个数存在这里面呢????
[/td][/tr]
[tr=rgb(255, 237, 196)][td]
还有如果在cuda核函数里面就定义int a;那a是存在哪里的呢???
[/td][/tr]
[/table]

LZ您好:

1:total constant 应该指的是constant cache。您使用__constant__定义的变量,将被存放在global memory中,并享受此cache的缓冲。以及,从fermi开始,kernel函数的参数也是存放在这个cache中的(这个是自动的,您无需手工操作)。

2:您在kernel中直接定义的变量默认就存放在寄存器中,也就是说一般优先使用此最快的存储资源。如果寄存器不够使用,那么将存储于local memory中,以及如果在kernel中定义的数组,其下标访问方式无法在编译时得知,则该数组也将存放在local memory中。
以及,local memory是存在于显卡DRAM上的存储空间,但是是每个线程私有的。

大致如此,供您参考。

祝您编码顺利~

那是不是就是说在核函数中直接定义int a;,那么a的存储速度最快,然后定义 int b[5];那么存储数组b的速度要比变量a慢?但他们的速度都比share memory还要快呢?
还有我不太懂“使用__constant__定义的变量,将被存放在global memory中,并享受此cache的缓冲。”请问是不是就是说此变量在cache中有备份,如果没被调出cache则读入则直接通过cache而不需在global memory中读出呢?

那是不是就是说在核函数中直接定义int a;,那么a的存储速度最快,然后定义 int b[5];那么存储数组b的速度要比变量a慢?但他们的速度都比share memory还要快呢?
还有我不太懂“使用__constant__定义的变量,将被存放在global memory中,并享受此cache的缓冲。”请问是不是就是说此变量在cache中有备份,如果没被调出cache则读入则直接通过cache而不需在global memory中读出呢?

LZ您好:

1:我并没有这么说。实际上在不考虑因为寄存器不够用而被转移到local memory的情况下,有:
a:在kernel中int a,a使用寄存器。
b:在kernel中intb[5],b可能使用寄存器也可能使用local memory。如果其下标访问规律在编译时是确定的,那么使用寄存器;否则如果下标访问规律要在运行时才能得知,那么使用local memory。
c:寄存器比shared memory快,而local memory是DRAM上的存储空间,所以更慢,大致和global memory一个速度,但是可能会因为cache的缓冲机制而有所弥补。

2:您的理解是正确的。这也是一般cache的机制。

cache是透明的,无法人为设定内部的数据。硬件会自动根据某种机制读取/预读取并保存一小部分较慢存储单元的数据。当访问某数据时,如果该数据在cache中(cache命中),则直接从cache中读取,这样速度很快;否则需要从较慢的存储空间中读取。

以及,一般的cache需要维护和被缓冲的存储单元内的数据的一致性。不过您这里提到的是constant cache,要求保存的都是不变的数值,那么显然容易保证一致性。

另外,CUDA中提供了可以手工操作的“cache”,称为shared memory。

大致如上,祝您编码顺利~

哦,大致明白,谢谢,就是如果可以尽量把变量定义成__share__可提高其读入的速度

LZ您好:

我可没有这么说“如果可以尽量把变量定义成__share__可提高其读入的速度”。

因为,即使读到shared memory中,也是从global memory中读进来的,而且读进来直接用的话是放在寄存器中的,比shared memory快。
此外,shared memory的容量是十分有限的。

实际上shared memory一般有如下两个用途:
1:作为block内通信手段/共享数据手段使用。
2:可以手工缓冲少量重复使用的数据,这样可以一次从global memory读取,然后block内反复使用,避免多次读取较慢的global memory。

大致如此,祝您编码顺利~

以及,“如果可以尽量把变量定义成__share__可提高其读入的速度”中应该是"shared"。

您可能笔误了。

祝您好运~

喔,完全明白,版主的回答非常详细!!!非常感谢

不客气的,十分欢迎您的到来!

我和横扫千军斑竹将竭诚为您服务~

祝您好运!