程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为 cublas 将设备端复杂 * 转换为 double * 或 float *大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决为 cublas 将设备端复杂 * 转换为 double * 或 float *?

开发过程中遇到为 cublas 将设备端复杂 * 转换为 double * 或 float *的问题如何解决?下面主要结合日常开发的经验,给出你关于为 cublas 将设备端复杂 * 转换为 double * 或 float *的解决方法建议,希望对你解决为 cublas 将设备端复杂 * 转换为 double * 或 float *有所启发或帮助;

问题

使用 complex *float * 转换为 double *reinterpret_cast() 指针是否安全

thrust::complex<float> *devicePtr; // only to show type,devicePtr otherwise lives in an object
/* OR */
float _Complex         *devicePtr;
/* OR */
std::complex<float>    *devicePtr;

cublasScnrm2(cublasv2handle,n,(cuComplex*)xarray,1,reinterpret_cast<float *>(obj->devicePtr));

如果没有,有没有聪明的方法来解决这个问题?

限制

  • obj 是一个 C 结构体(所以不可能有直接的运算符重载)
  • 我无法将 devicePtr 存储为 float * 内的 obj
  • devicePtr 只持有一个指向单个值的指针。虑到 reinterpret_cast 诡计,这可能是相关的,但在幕后,devicePtr 是池的一部分:
static thrust::complex<float> *pool;
/* OR */
static float _Complex         *pool;
/* OR */
std::complex<float>           *pool;

voID giveObjectDevicePtr(object obj)
{
  for (int i = 0; i < poolSize; ++i) {
    if (poolEntryIsFree(pool,i)) obj->devicePtr = pool+i;
  }
}
  • cublas 调用是在流上异步进行的,因此应避免将 devicePtr 的内容复制到主机并同步流以执行转换。
    • 同样,启动微内核也不理想,但也许是不可避免的。

我已经看到 many questions 关于将 double *float * 转换为 complex *,但反过来的情况并不多。

解决方法

在幕后,CUDA 中可用的复杂类型通常应该是一个包含两个值的结构。您可以通过查看 cuComplex.h 头文件(作为一个可能的示例)来理解我的意思。

将指向这种类型的指针投射到与该结构中的值一致的指针类型,通常应该比其他方式风险更低(相反方式除了基址之外还有额外的对齐要求)输入)。

如果你确切地假设你正在讨论的类型,那么我声称这个问题与 CUDA 无关,而且实际上只是一个 C++ 问题。

如果您进行这样的转换,然后将其提供给 cublas 函数,在一般情况下,我认为您将同时计算实部和虚部,这对我来说似乎很奇怪。但是,对于您所展示的案例,这应该不是问题。

您似乎也对设备指针所在的位置有些困惑:

将 devicePtr 复制到主机

任何可用于 CUBLAS 调用的最新版本 CUBLAS 的设备指针都存在于主机内存中。

,

根据文档,这在理论上应该是可能的,尽管它并不明确。

如果您正在处理 std::complex<T>,答案将是肯定的“是”。根据{{​​3}},指向std::complex<T>数组的指针可以reinterpret_cast指向指向T数组的指针,具有直观的语义。这是为了与 C 的复数兼容。

现在 thrust::complex<T>,cppreference,“它在功能上与它相同,但也可以用于 std::complex 当前不能的设备代码。” “功能相同”是否包括与 C 的复杂类型的兼容性并不明确。也就是说,结构的布局与人们期望的 std::complex<T> 布局一样,这意味着(在实际意义上)这样的转换很可能像 std::complex<T> 一样工作。

@H_489_106@

大佬总结

以上是大佬教程为你收集整理的为 cublas 将设备端复杂 * 转换为 double * 或 float *全部内容,希望文章能够帮你解决为 cublas 将设备端复杂 * 转换为 double * 或 float *所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。