代码之家  ›  专栏  ›  技术社区  ›  avgn

有可能把指针指向cuDoubleComplex的实部和虚部吗?

  •  0
  • avgn  · 技术社区  · 8 年前

    考虑 cuDoubleComplex a 在设备内存中。有没有可能把指针指向 一 不需要将一个深度拷贝分配到两个新的 double 阵列?

    像这样的:

    real_a = //points to real part of a
    imag_a = //points to imaginary part of a
    

    而不是像:

    /*allocate real_a and imag_a here */
        for(int j=0; j<numElements; j++){
            real_a[j]= a[j].x;
            imag_a[j]= a[j].y;
    }
    

    CUDA does have something like this for numbers ,但不适用于数组/指针。

    原因是我想打电话给库布拉斯 D 而不是 Z 分别在实部和虚部上的函数。例如,

    cublasDgemm(...,real_a,...,somearray,...,anotherarray,...)
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   talonmies    8 年前

    有没有可能把指针指向 不分配一个深度拷贝到两个新的双数组中?

    这可以做到:

    double* real_a = reinterpret_cast<double*>(&a[0].x); //points to real part of a
    double* imag_a = reinterpret_cast<double*>(&a[0].y); //points to imaginary part of a
    

    但是请注意,在访问指针以获得正确的实数或虚数元素时,需要使用步长2。

    原因是我想打电话给小熊 而Z函数分别作用于实部和虚部。

    这将与BLAS函数一起工作,BLAS函数将实数或虚数指针作为向量操作,因为这些BLAS例程允许传递一个跨距(在本例中必须是两个跨距)。

    例如,

    cublasDgemm(...,real_a,...,somearray,...,anotherarray,...)

    这不适用于我在这里展示的可以直接得到的指针。将数组视为矩阵的BLAS函数确实支持跨行的源和目标数据,但该跨行应用于每个列的开头,而不是列中的元素,这是使该操作正常工作所需的。