2016-04-05 11 views
5

मैं गणना करने के लिए वैक्टर \vec{a} और \vec{b}, जहां \left | \vec{x} \right | वेक्टर \vec{x} की भयावहता को दर्शाता है के लिए \left | \vec{a} - \vec{b} \right | चाहते हैं। चूंकि इसमें दो वैक्टरों के प्रत्येक संबंधित घटक के बीच मतभेदों के वर्गों के योग की वर्ग जड़ लेना शामिल है, यह एक बेहद समानांतर कार्य होना चाहिए। मैं विंडोज 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". 

उत्तर

3

हल! tupthrust::tuple<float, float> होना चाहिए, thrust::tuple<iter, iter> नहीं होना चाहिए। पूर्ण समाधान:

#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 thrust::tuple<float, float> tup; 

struct func 
{ 
    __device__ float operator()(tup t) //difsq 
    { 
    float f = thrust::get<0>(t) - thrust::get<1>(t); 
    return f*f; 
    } 
}; 

int main() 
{ 
    dvec a(4, 3.f); 
    dvec b(4, 2.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())); 
    std::cout << thrust::transform_reduce(begin, end, func(), 0.0f, thrust::plus<float>()) << std::endl; 
    std::cout << "done" << std::endl; 
    return 0; 
} 

 संबंधित मुद्दे