DAY107:阅读Querying Usage Attributes

  • 2 replies
  • 1284 views
*

sisiy

  • *****
  • 203
    • 查看个人资料
DAY107:阅读Querying Usage Attributes
« 于: 十二月 07, 2018, 03:11:29 pm »
K.3.3. Querying Usage AttributesA program can query memory range attributes assigned through cudaMemAdvise or cudaMemPrefetchAsync by using the following API:    
程序代码: [选择]
cudaMemRangeGetAttribute(void *data,
                             size_t dataSize,
                             enum cudaMemRangeAttribute attribute,
                             const void *devPtr,
                             size_t count);

This function queries an attribute of the memory range starting at devPtr with a size of count bytes. The memory range must refer to managed memory allocated via cudaMallocManaged or declared via __managed__ variables. It is possible to query the following attributes:
  • cudaMemRangeAttributeReadMostly: the result returned will be 1 if all pages in the given memory range have read-duplication enabled, or 0 otherwise.
  • cudaMemRangeAttributePreferredLocation: the result returned will be a GPU device id or cudaCpuDeviceId if all pages in the memory range have the corresponding processor as their preferred location, otherwise cudaInvalidDeviceId will be returned. An application can use this query API to make decision about staging data through CPU or GPU depending on the preferred location attribute of the managed pointer. Note that the actual location of the pages in the memory range at the time of the query may be different from the preferred location.
  • cudaMemRangeAttributeAccessedBy: will return the list of devices that have that advise set for that memory range.
  • cudaMemRangeAttributeLastPrefetchLocation: will return the last location to which all pages in the memory range were prefetched explicitly using cudaMemPrefetchAsync. Note that this simply returns the last location that the application requested to prefetch the memory range to. It gives no indication as to whether the prefetch operation to that location has completed or even begun.

Additionally, multiple attributes can be queried by using corresponding cudaMemRangeGetAttributes function.

*

sisiy

  • *****
  • 203
    • 查看个人资料
(无标题)
« 回复 #1 于: 十二月 07, 2018, 03:38:36 pm »
这章节是查询一段Unified Memory上,之前你所进行过的hint/advice设定,或者你进行过的prefetch操作的信息。我简单的来说一下该函数的用法,和该函数的所能查询到的属性的介绍。如果你还没有记错的话,之前的两天我们最后介绍了新的Unified Memory平台上(Pascal+,在支持的时候),所额外引入的新的memory advice/hint操作,以及,prefetch操作。而本章节函数所能查询到的信息,则就是之前你曾经设定过的这些信息。所以一般来说,你也可以不调用它们(你如果刚刚设定过的,你肯定知道)。
但是有的时候还是必须要求进行查询的,例如考虑这种情况:

(1)在库函数中进行的操作。或者你接触不到代码的第三方开发。这个时候进行上述信息的查询还是非常重要的。或者考虑:

(2)的确都是用户自己手工操作的,但程序的逻辑很复杂,很难有效的跟踪之前都做过了什么。此时也可以进行查询。

这是可能应用点。

然后说一下本章节的函数cudaMemRangeGetAttribute获取属性时候所需要提供的信息,这里有一点需要注意的是, 前两个参数,void *data, 和size_t dataSize,这两个参数实际上是返回值。很多API喜欢用带有IN和OUT字样的宏来修饰参数。但是CUDA不知道。但是你得知道前两个参数实际上是用来容纳返回值的。实际上,竞争关系的API,OpenCL中的很多获取属性信息的方式也都是这种风格(一个指针指向返回值的地址,另外一个描述返回值的最大可容纳大小)。来自OpenCL的人可能非常熟悉这点。

这是函数本身。

然后该函数一次只能获取一种属性信息(就是之前章节说过的prefetch和3种hints),需要获取那种属性,将中间的attribute参数设定成本章章节下面说的那一种。然后调用即可获取某种属性的对应信息。这里这里有一种需要特例的情况:

在获取AccessedBy属性的时候(也就是尝试建议/暗示那些设备需要对目标的这段Unified Memory建立页表映射关系),你需要提供足够大的空间。

实际上这里你将提供一个list,例如一个8卡的系统,你可以提供8个结果值的空间,或者提供更大的,例如20个值的空间。用户可以简单的预估一个可能的最大值,例如一个20卡的系统(虽然这么多卡的系统我没见过),然后该API返回的时候,将填充那些实际上有映射关系的卡项,

例如前8个结果值被填充成有效的卡号。这说明这8个卡曾经被设定过该属性(对该段Unified Memory)。剩下的空间都将被cudaInvalidDeviceId这个特殊值(一般代表无效设备编号)所填充,代表该列表的结尾符。其他的2个属性就是常规的,没有什么能说的。以及,这里还将返回你最后一次发出的Prefetch操作时候的信息。类似普通的设备属性查询。

这个函数还有另外一个版本,
可以一次性的查询多个或者所有的属性。请用户自行查看Runtime API手册,看看这些属性的信息。




这里需要注意的一点,很多单体函数(本章节)的参数,都多了一个*号。这是因为C没有很好的方式来取得多个的返回值。用户如果在使用其他的语言(例如C#)的CUDA包装/bindings的时候,可能会看到更加简洁的用法。

然后就没有然后了。



手册结束了。。。




(无标题)
« 回复 #2 于: 十二月 13, 2018, 08:55:57 am »
后面会 考虑出个性能分析系列吗? 比如说如何使用NVIDIA的性能分析工具,计算核函数的理论运行速度,分析核函数的性能瓶颈等