在CUDA中查找最大/最小值而不将其传递给CPU

时间:2013-08-29 12:03:43

标签: cuda parallel-processing nvidia cublas

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

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

谢谢!

2 个答案:

答案 0 :(得分:6)

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

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

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

result必须是设备指针。

答案 1 :(得分:0)

如果您想使用CUBLAS,并且您的GPU具有计算能力3.5(K20,Titan),那么您可以使用具有动态并行性的CUBLAS。您可以从GPU内核中调用CUBLAS,并且不会将数据返回给CPU。 如果你没有配备cc 3.5的设备,你可能需要自己实现一个find max功能,或者寻找一个附加的库。

相关问题