मैं गणना करने के लिए वैक्टर और , जहां वेक्टर की भयावहता को दर्शाता है के लिए चाहते हैं। चूंकि इसमें दो वैक्टरों के प्रत्येक संबंधित घटक के बीच मतभेदों के वर्गों के योग की वर्ग जड़ लेना शामिल है, यह एक बेहद समानांतर कार्य होना चाहिए। मैं विंडोज 10 पर सिग्विन के माध्यम से, कुडा और थ्रस्ट का उपयोग कर रहा हूं। दोनों कूडा और जोर सामान्य काम कर रहे हैं।CUDA zip_iterator टपल जोर transform_reduce
नीचे कोड संकलित और चलाता है (एनवीसीसी के साथ), लेकिन केवल इसलिए कि मैंने main
के नीचे की ओर तीन पंक्तियों पर टिप्पणी की है, जिनमें से प्रत्येक मुझे लगता है कि काम करना चाहिए लेकिन नहीं। func::operator()(tup t)
सोचता है कि जिन तर्कों को मैं पास कर रहा हूं वे टाइप टुप के तथ्य में नहीं हैं।
मैंने कम से कम संकलन करने की अधिक संभावना बनाने के हित में ऑपरेटर के वास्तविक निकाय पर भी टिप्पणी की है। ऑपरेटर को इनपुट टुप के तत्वों के बीच स्क्वायर अंतर मिलना चाहिए। transform_reduce
से घटाएं (जो इस मामले में func()
है) तो इन्हें जोड़ देगा, जिससे मुझे वैक्टरों के अंतर का मानक वर्ग दिया जा सकेगा।
#include <iostream>
#include <stdlib.h>
#include <thrust/device_vector.h>
#include <thrust/transform.h>
#include <thrust/tuple.h>
#include <thrust/transform_reduce.h>
#include <thrust/iterator/zip_iterator.h>
typedef thrust::device_vector<float> dvec;
typedef dvec::iterator iter;
typedef thrust::tuple<iter, iter> tup;
struct func: public thrust::unary_function<tup, float>
{
__device__ float operator()(tup t) //difsq
{
// I've commented out these two lines for testing purposes:
// float f = thrust::get<0>(t) - thrust::get<1>(t);
// return f*f;
return 3.14;
}
};
int main()
{
dvec a(40, 4.f);
dvec b(40, 3.f);
auto begin = thrust::make_zip_iterator(thrust::make_tuple(a.begin(), b.begin()));
auto end = thrust::make_zip_iterator(thrust::make_tuple(a.end(), b.end()));
//these two lines work
thrust::get<0>(begin[0]);
std::cout << thrust::get<0>(begin[0]) - thrust::get<1>(begin[0]);
//these three lines do not
//thrust::transform_reduce(begin, end, func(), 0.0f, thrust::plus<float>());
//func()(begin[0]);
//thrust::transform(begin, end, begin, func());
std::cout << "done" << std::endl;
return 0;
}
मैं इस त्रुटि मिलती है: (मेरे कार्यक्रम sandbox.cu
कहा जाता है)
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin/../include\thrust/detail/tuple.inl(310): error: no instance of constructor "thrust::detail::normal_iterator<Pointer>::normal_iterator [with Pointer=thrust::device_ptr<float>]" matches the argument list
argument types are: (const thrust::device_reference<float>)
detected during:
instantiation of "thrust::detail::cons<HT, TT>::cons(const thrust::detail::cons<HT2, TT2> &) [with HT=iter, TT=thrust::detail::cons<iter, thrust::null_type>, HT2=thrust::device_reference<float>, TT2=thrust::detail::cons<thrust::device_reference<float>, thrust::null_type>]"
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin/../include\thrust/tuple.h(361): here
instantiation of "thrust::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::tuple(const thrust::detail::cons<U1, U2> &) [with T0=iter, T1=iter, T2=thrust::null_type, T3=thrust::null_type, T4=thrust::null_type, T5=thrust::null_type, T6=thrust::null_type, T7=thrust::null_type, T8=thrust::null_type, T9=thrust::null_type, U1=thrust::device_reference<float>, U2=thrust::detail::cons<thrust::device_reference<float>, thrust::null_type>]"
sandbox.cu(37): here
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin/../include\thrust/detail/tuple.inl(411): error: no instance of constructor "thrust::detail::normal_iterator<Pointer>::normal_iterator [with Pointer=thrust::device_ptr<float>]" matches the argument list
argument types are: (const thrust::device_reference<float>)
detected during:
instantiation of "thrust::detail::cons<HT, thrust::null_type>::cons(const thrust::detail::cons<HT2, thrust::null_type> &) [with HT=iter, HT2=thrust::device_reference<float>]"
(310): here
instantiation of "thrust::detail::cons<HT, TT>::cons(const thrust::detail::cons<HT2, TT2> &) [with HT=iter, TT=thrust::detail::cons<iter, thrust::null_type>, HT2=thrust::device_reference<float>, TT2=thrust::detail::cons<thrust::device_reference<float>, thrust::null_type>]"
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin/../include\thrust/tuple.h(361): here
instantiation of "thrust::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::tuple(const thrust::detail::cons<U1, U2> &) [with T0=iter, T1=iter, T2=thrust::null_type, T3=thrust::null_type, T4=thrust::null_type, T5=thrust::null_type, T6=thrust::null_type, T7=thrust::null_type, T8=thrust::null_type, T9=thrust::null_type, U1=thrust::device_reference<float>, U2=thrust::detail::cons<thrust::device_reference<float>, thrust::null_type>]"
sandbox.cu(37): here
2 errors detected in the compilation of "C:/cygwin64/tmp/tmpxft_00001a90_00000000-10_sandbox.cpp1.ii".