私のコードでは推力ライブラリの複素数を持つ配列を使用していますので、配列を転置するためにcublasZgeam()を使いたいと思います。推力の複素数を使ったcuBLASの使用
cuComplex.hからの複素数の使用は、配列に対して多くの計算を行い、cuComplexは* + =などの演算子を定義していないため、好ましいオプションではありません。コンパイル時に
#include "cuComplex.hpp"
doesntのは、私が言及した演算子を使用することができます:
この
は私が、私はこの https://github.com/jtravs/cuda_complexを発見したthrust::complex<float> u[xmax][xmax];
を移調したいアレイを定義しますが、そのように使用する方法ですwith nvcc
error: no operator "+=" matches these operands
operand types are: cuComplex += cuComplex
いくつかの方法がありますか? githubからのコードは古いですし、問題があるかもしれませんが、おそらく私が間違って使っているかもしれません。
EDIT:ここでは動作するコードはありますが、talonmiesコードとの違いは単純なカーネルと同じデータへのポインタですが、あなたの抗議にもかかわらず
#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;
}
C++標準ライブラリ複合型と関数を使用できませんか? – talonmies
これは私が試したもので、https://pastebin.com/hCjPvdBmを動作させていないようです –
@talonmies私はこの文書を読んでいます:http://docs.nvidia.com/cuda/cublas/#cublas-lt- t-ge-geam。そして、私はそれを誤解する可能性があることを認めなければなりませんが、作業例も確認しました –