Xin chào Tôi có vòng lặp này trong C + và tôi đang cố chuyển đổi nó thành lực đẩy nhưng không nhận được kết quả tương tự ... Bất kỳ ý tưởng nào? cảm ơn bạnChuyển đổi phức tạp lực đẩy của 3 vectơ kích thước khác nhau
C++ Mã
for (i=0;i<n;i++)
for (j=0;j<n;j++)
values[i]=values[i]+(binv[i*n+j]*d[j]);
Thrust Mã
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()
);
Thrust Chức năng
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);
}
};
Cảm ơn câu trả lời của bạn. Nhưng vấn đề không phải là với các điểm nổi của nó hoàn toàn khác nhau mặc dù tôi chỉ chạy nó một lần. Tại sao bạn nghĩ quyền của nó? –
Tôi đổ lỗi cho sự chính xác, bởi vì - theo kinh nghiệm của tôi - đây là nguồn khác biệt phổ biến nhất. Tất nhiên, trừ khi có một số lỗi đơn giản, mà tôi không thấy trong mã của bạn. Làm thế nào để bạn biết chắc chắn, vấn đề là không có? Sự khác biệt lớn đến mức nào? Loại GPU bạn đang chạy trên đó? – CygnusX1
Tôi đang chạy trên một gtx 460 với vòm 20 và các vectơ được nhân đôi. nó có thể là các vector giá trị viết cho chính nó? –