2016-06-08 4 views
0

я следующую функцию для заполнения вектора т с шагом от -time/2 времени/2 и размер шага DT:Thrust: Operator «*» не поддерживается

#define THRUST_PREC thrust::complex<double> 
__host__ void generate_time(thrust::device_vector<THRUST_PREC> *t, const double dt, const double time) 
{ 
    THRUST_PREC start = -time/2.0; 
    THRUST_PREC step = dt; 
    thrust::sequence((*t).begin(), (*t).end(), start, step); 
} 

При компиляции, я получаю error : no operator "*" matches these operands , Зачем? Есть ли способ заполнить вектор так, как я, или я должен заполнить его по-старому (aka loop)?

Edit: Полная ошибка: Error 1 error : no operator "*" matches these operands C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include\thrust\system\detail\generic\sequence.inl 48 1 FFT_test

+4

Просьба предоставить [mcve] и предоставить * полный набор ошибок и примечаний * из компилятора не только exerpt. Если вы поняли сообщение об ошибке, вам не нужно будет спрашивать здесь, и если вы не понимаете, почему, по вашему мнению, резюме достаточно? Я имею в виду, я не могу поверить, что это не привело к тому, что произошла ошибка. – Yakk

+0

@Yakk: Я добавил полную ошибку, вот и все, что я получаю в MSVC ... –

+0

Не знаю, я скопировал ошибку непосредственно из MSVC. При удалении/комментировании этой функции ошибка исчезла. При добавлении/раскомментировании я получаю указанную выше ошибку. –

ответ

4

Это похоже на ошибку в thrust::complex. Операция умножения между const thrust:complex<double> и signed long не определена.

/usr/local/cuda/bin/../targets/x86_64-linux/include/thrust/system/detail/generic/sequence.inl(48): 
error: no operator "*" matches these operands 
      operand types are: const thrust::complex<double> * signed long 
      detected during: 
      .... 

Но как ни странно, вы могли бы использовать вместо thrust::transform. Следующий код работает.

#define THRUST_PREC thrust::complex<double> 
__host__ void generate_time(thrust::device_vector<THRUST_PREC> *t, const double dt, const double time) 
{ 
    THRUST_PREC start = -time/2.0; 
    THRUST_PREC step = dt; 
    thrust::transform(thrust::make_counting_iterator(0), 
        thrust::make_counting_iterator(0) + t->size(), 
        t->begin(), 
        start + step * _1); 
} 

В любом случае, внутренняя реализация использует индекс (типа signed long в thrust::sequence), чтобы вычислить требуемую последовательность с выражением

start + step * index; 

Дело предотвращает thrust::sequence от работы является то, что operator *(...) является не очень перегружен.

thrust::complex<double> a(1,1); 
double double_b = 4; 
float float_b = 4; 
int int_b = 4; 
long long_b = 4; 

a *= double_b; // ok 
a *= float_b; // ok 
a *= int_b; // ok 
a *= long_b; // ok 

std::cout << a * double_b << std::endl; // ok 
std::cout << a * float_b << std::endl; // error 
std::cout << a * int_b << std::endl; // error 
std::cout << a * long_b << std::endl; // error 
+0

Я не получаю этот вывод как сообщение об ошибке, только первая часть, которую я разместил. Почему в любом случае подписанный им длинный? –

+0

Вы также можете определить его самостоятельно. :) – Yakk

+0

@arc_lupus мы используем разные компиляторы. – kangshiyin

Смежные вопросы