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;
}