Dans mon code j'utilise des tableaux avec des nombres complexes de la bibliothèque thrust et j'aimerais utiliser cublasZgeam() pour transposer le tableau. L'utilisation de nombres complexes à partir de cuComplex.h n'est pas une option préférable puisque je fais beaucoup d'arithmétique sur la matrice et que cuComplex n'a pas d'opérateurs définis tels que * + =.Utilisation de cuBLAS avec des nombres complexes à partir de Thrust
Voici comment tableau je définissais que je veux transposer
thrust::complex<float> u[xmax][xmax];
J'ai trouvé ce https://github.com/jtravs/cuda_complex, mais en utilisant comme tel:
#include "cuComplex.hpp"
ne marche pas me permettre d'utiliser les opérateurs mentionnés lors de la compilation avec nvcc
error: no operator "+=" matches these operands
operand types are: cuComplex += cuComplex
Y at-il une solution à cela? Code de github est vieux et il peut poser le problème ou peut-être que je l'utilise mal
EDIT: Voici le code qui fonctionne, seule différence de code talonmies est l'ajout de noyau simple et le pointeur vers les mêmes données mais étant thrust :: complexe
#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;
}
Vous ne pouvez pas utiliser les types et les fonctions complexes de la bibliothèque standard C++? – talonmies
C'est ce que j'ai essayé et il ne semble pas fonctionner https://pastebin.com/hCjPvdBm –
@talonmies J'ai lu ce doc: http://docs.nvidia.com/cuda/cublas/#cublas-lt- t-gt-geam. Et je dois admettre qu'il y a une chance pour moi de mal le comprendre, mais j'ai aussi vérifié quelques exemples de travail –