Ciao ho questo ciclo in C +, e stavo cercando di convertirlo in spinta ma senza ottenere gli stessi risultati ... Qualche idea? grazieTraslazione complessa spinta di 3 vettori di dimensioni diverse
codice C++
for (i=0;i<n;i++)
for (j=0;j<n;j++)
values[i]=values[i]+(binv[i*n+j]*d[j]);
Codice spinta
thrust::fill(values.begin(), values.end(), 0);
thrust::transform(make_zip_iterator(make_tuple(
thrust::make_permutation_iterator(values.begin(), thrust::make_transform_iterator(thrust::make_counting_iterator(0), IndexDivFunctor(n))),
binv.begin(),
thrust::make_permutation_iterator(d.begin(), thrust::make_transform_iterator(thrust::make_counting_iterator(0), IndexModFunctor(n))))),
make_zip_iterator(make_tuple(
thrust::make_permutation_iterator(values.begin(), thrust::make_transform_iterator(thrust::make_counting_iterator(0), IndexDivFunctor(n))) + n,
binv.end(),
thrust::make_permutation_iterator(d.begin(), thrust::make_transform_iterator(thrust::make_counting_iterator(0), IndexModFunctor(n))) + n)),
thrust::make_permutation_iterator(values.begin(), thrust::make_transform_iterator(thrust::make_counting_iterator(0), IndexDivFunctor(n))),
function1()
);
Funzioni di spinta
struct IndexDivFunctor: thrust::unary_function<int, int>
{
int n;
IndexDivFunctor(int n_) : n(n_) {}
__host__ __device__
int operator()(int idx)
{
return idx/n;
}
};
struct IndexModFunctor: thrust::unary_function<int, int>
{
int n;
IndexModFunctor(int n_) : n(n_) {}
__host__ __device__
int operator()(int idx)
{
return idx % n;
}
};
struct function1
{
template <typename Tuple>
__host__ __device__
double operator()(Tuple v)
{
return thrust::get<0>(v) + thrust::get<1>(v) * thrust::get<2>(v);
}
};
Grazie per la risposta. Ma il problema non è con i punti di galleggiamento è completamente diverso anche se lo eseguo solo una volta. Perché pensi sia giusto? –
Do la colpa alla precisione, perché - nella mia esperienza - questa è la fonte più comune di differenze. Ovviamente, a meno che non ci sia un bug diretto, che non vedo nel tuo codice. Come lo sai per certo, il problema non c'è? Quanto sono grandi le differenze? Che tipo di GPU stai usando? – CygnusX1
Sto lavorando su un GTX 460 con l'Arch20 ei vettori sono doppi. potrebbe essere che il vettore dei valori scrive a se stesso? –