【发布时间】:2023-04-06 23:58:01
【问题描述】:
问题
使用reinterpret_cast() 将complex * 转换为float * 或double * 指针是否安全
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 *,但反之则不多。
【问题讨论】:
-
为了清楚起见,请注意:您链接到的问题是关于
std::complex,而不是thrust::complex。虽然有意与std::complex兼容,但我的理解是reinterpret_casts 的指定相当差,因此很难做出具体保证。 -
啊抱歉,这是因为我忘记添加
thrust::complex也可能是std::complex的问题,我将编辑问题以反映这一点。感谢您指出这一点。