在 CUDA 中查找 max/min 而不将其传递给 CPU

Posted

技术标签:

【中文标题】在 CUDA 中查找 max/min 而不将其传递给 CPU【英文标题】:Find max/min in CUDA without passing it to the CPU 【发布时间】:2013-09-01 20:38:01 【问题描述】:

我需要找到浮点数组中最大元素的索引。我正在使用函数“cublasIsamax”,但这会将索引返回给 CPU,这会减慢应用程序的运行时间。

有没有办法有效地计算这个索引并将其存储在 GPU 中?

谢谢!

【问题讨论】:

【参考方案1】:

自从引入了 CUBLAS V2 API(使用 CUDA 4.0,IIRC),可以有返回标量或索引的例程将它们直接存储到设备内存中的变量中,而不是存储到主机变量中(这需要设备到主机的传输,可能会将结果留在错误的内存空间中)。

要使用它,您需要使用cublasSetPointerMode 调用来告诉CUBLAS 上下文使用CUBLAS_POINTER_MODE_DEVICE 模式将标量参数的指针期望为设备 指针。这意味着在像

这样的调用中
cublasStatus_t cublasIsamax(cublasHandle_t handle, int n,
                            const float *x, int incx, int *result)

result 必须是设备指针。

【讨论】:

【参考方案2】:

如果您想使用 CUBLAS 并且您的 GPU 具有 3.5 的计算能力(K20,Titan),那么您可以使用具有动态并行性的 CUBLAS。您可以从 GPU 的内核中调用 CUBLAS,并且不会将任何数据返回到 CPU。 如果您没有 cc 3.5 的设备,您可能必须自己实现 find max 功能或寻找额外的库。

【讨论】:

以上是关于在 CUDA 中查找 max/min 而不将其传递给 CPU的主要内容,如果未能解决你的问题,请参考以下文章

Codeception 助手使用 $I 而不将其传递给助手

jQuery:如何在事件处理函数中获取事件对象而不将其作为参数传递?

如何将一些信息传递给视图而不将其包含在 URL 中(django 新手)

如何从 Terraform 输出中传递值而不将其放入 tfvars 文件中

查找 JSON 对象大小而不将其解析为字符串

如何发布数据而不将其传递给模型.Net Core