Usando cuBLAS com números complexos da Thrust

No meu código, uso matrizes com números complexos da biblioteca de empuxo e gostaria de usar cublasZgeam () para transpor a matriz.

Usar números complexos do cuComplex.h não é uma opção preferível, pois faço muita aritmética na matriz e o cuComplex não possui operadores definidos como * + =.

É assim que eu defini o array que eu quero transpor

thrust::complex<float> u[xmax][xmax];

Eu encontrei issohttps://github.com/jtravs/cuda_complex, mas usando-o como tal:

#include "cuComplex.hpp"

não me permite usar os operadores mencionados quando compilados com nvcc

error: no operator "+=" matches these operands
        operand types are: cuComplex += cuComplex

Existe alguma solução para isso? O código do github é antigo e pode haver um problema ou talvez eu esteja usando errado

EDIT: Aqui está o código que funciona, a única diferença do código talonmies é adicionar kernel e ponteiro simples aos mesmos dados, mas sendo empurrado :: complex

#include <iostream>
#include <thrust/fill.h>
#include <thrust/complex.h>
#include <cublas_v2.h>

using namespace std;

__global__ void test(thrust::complex<double>* u) {

  u[0] += thrust::complex<double>(3.3,3.3);
}

int main()
{
  int xmax = 100;
  thrust::complex<double>  u[xmax][xmax];
  double arrSize = sizeof(thrust::complex<double>) * xmax * xmax;

  thrust::fill(&u[0][0], &u[0][0] + (xmax * xmax), thrust::complex<double>(1.0,1.0));
  u[49][51] += thrust::complex<double>(665.0,665.0);
  u[51][49] *= 2.0;

  cout << "Before:" << endl;
  cout << u[49][51] << endl;
  cout << u[51][49] << endl;
  cout << u[0][0] << endl;

  thrust::complex<double> alpha(1.0, 0.0);
  thrust::complex<double> beta(0.0, 0.0);
  cublasHandle_t handle;
  cublasCreate(&handle);

  cuDoubleComplex* d_u;
  cuDoubleComplex* d_v;
  cuDoubleComplex* _alpha = reinterpret_cast<cuDoubleComplex*>(&alpha);
  cuDoubleComplex* _beta = reinterpret_cast<cuDoubleComplex*>(&beta);
  cudaMalloc(&d_u, arrSize);
  cudaMalloc(&d_v, arrSize);
  cudaMemcpy(d_u, &u[0][0], arrSize, cudaMemcpyHostToDevice);
  thrust::complex<double>* d_vTest = reinterpret_cast<thrust::complex<double>* >(d_v);
  cublasZgeam(handle, CUBLAS_OP_T, CUBLAS_OP_N, xmax, xmax,
                  _alpha, d_u, xmax,
                  _beta,  d_u, xmax,
                  d_v, xmax);
  test<<<1,1>>>(d_vTest);
  cudaMemcpy(u, d_v, arrSize, cudaMemcpyDeviceToHost);
  cout << "After:" << endl;
  cout << u[0][0] << endl;
  cout << u[49][51] << endl;
  cout << u[51][49] << endl;

  return 0;
}

questionAnswers(1)

yourAnswerToTheQuestion