인텔 Cilk Plus 확장에는 cilk_for (또는 실제로 _Cilk_for 키워드)가 있습니다. 그것은 for 키워드와 같지만 좀 더 제한적이며 iteration은 병렬로 실행됩니다. 내부적으로 cilk_for를 사용하는 BOOST_FOREACH의 정신으로 편리한 매크로를 작성했습니다. 다음 구현에서 문제가 발생할 수 있습니까?foreach 매크로 구현에 문제가 있습니까
#pragma once
#include <iterator>
#include <boost/preprocessor/cat.hpp>
#include <cilk/cilk.h>
#define cilk_foreach(_decl_var_, _expr_range_) \
CILK_FOREACH_I(_decl_var_, _expr_range_, __COUNTER__)
#define CILK_FOREACH_I(_decl_var_, _expr_range_, _id_) \
CILK_FOREACH_II(_decl_var_, \
_expr_range_, \
BOOST_PP_CAT(_range_3s236dw221GyVcf46_, _id_), \
BOOST_PP_CAT(_end_5Y60u42bIp7DZd88f2c_, _id_), \
BOOST_PP_CAT(_itr_6V970q8n4Etv0i8bf50_, _id_), \
BOOST_PP_CAT(_continue_4rtWH641r5cXqU_, _id_))
#define CILK_FOREACH_II(_decl_var_, _expr_range_, _range_, _end_, _itr_, _cont_) \
auto&& _range_ = _expr_range_; \
auto _end_ = std::end(_range_); \
\
cilk_for (auto _itr_ = std::begin(_range_); _itr_ != _end_; ++_itr_) \
if (auto _cont_ = true) \
for (_decl_var_ = *_itr_; _cont_; _cont_ = false)
당신은 너무처럼 사용합니다 :
std::vector<int> values (10);
cilk_foreach (auto& value , values)
{
value += 123;
}
편집
template <typename T>
struct Wrap
{
T& data;
explicit Wrap(T&& data)
: data (data)
{}
operator bool() const
{
return true;
}
};
template <typename T>
Wrap<T> wrap(T&& data)
{
return Wrap<T>(std::forward<T>(data));
}
#define cilk_foreach(_decl_var_, _expr_range_) \
CILK_FOREACH_I(_decl_var_, _expr_range_, __COUNTER__)
#define CILK_FOREACH_I(_decl_var_, _expr_range_, _id_) \
\
CILK_FOREACH_II(_decl_var_, \
_expr_range_, \
BOOST_PP_CAT(_range_3s236dw221GyVcf46_, _id_), \
BOOST_PP_CAT(_itr_6V970q8n4Etv0i8bf50_, _id_), \
BOOST_PP_CAT(_continue_4rtWH641r5cXqU_, _id_))
#define CILK_FOREACH_II(_decl_var_, _expr_range_, _range_, _itr_, _cont_) \
\
if (auto _range_ = wrap(_expr_range_)) \
cilk_for (auto _itr_ = std::begin(_range_.data); \
_itr_ != std::end (_range_.data); \
++_itr_) \
if (auto _cont_ = true) \
for (_decl_var_ = *_itr_; _cont_; _cont_ = false)
이 일을합니까? – Mat
네, 테스트 해본 결과 거의 효과가있는 것 같습니다. BOOST_FOREACH 구현이 왜 그렇게 복잡한 지 혼란 스럽습니다. 위의 구현과 같은 단순한 구현도 가능합니다. 분명히 cilk_for의 모든 제한이 계속 적용되므로 범위가 임의 액세스 여야합니다. – zeroes00
깔끔하지만, std :: for_each를 통해 얻은 이점은 무엇입니까? – dans3itz