Nano Hash - криптовалюты, майнинг, программирование

Thrust::transform_reduce Как я могу получить доступ к итератору в унарной операции?

Я пытаюсь выполнить преобразование, уменьшающее вектор структур. Структура содержит два числа. Я хочу, чтобы унарная функция что-то делала с этими двумя числами и возвращала одно значение для каждой структуры в моем векторе и уменьшала с суммированием этих значений. Как написать свой функтор для доступа к значениям в структуре?

например, каков правильный синтаксис для mystruct.value1 внутри функции?:

struct unary_op
{
    float operator()()
    {
        return mystruct.value1 + mystruct.value2; //function is a lot more complex 
    }
}

поэтому я могу сделать:

unary_op uop1;
thrust::transform_reduce(myvec.begin(), myvec.end(), uop1, 0, thrust::add)
14.02.2013

  • определить operator() как __host__ __device__ float operator()() 14.02.2013
  • хорошо, но каков правильный синтаксис для mystruct.value1 внутри функции? спасибо, это тоже важно. 14.02.2013
  • унарные операции принимают один аргумент. Ваш operator() ничего не принимает. 14.02.2013

Ответы:


1

Отказ от ответственности. Поскольку вы, очевидно, не опубликовали реальный код, а ваш пример выглядит как несколько несвязанных строк кода, мой ответ может не соответствовать тому, что вы ищете — SSCCE было бы неплохо.

Если я правильно понимаю, вы хотите преобразовать_свести вектор MyStructs к сумме всех значений элементов структуры. Для этого вам понадобится двоичное сложение (thrust::add) и унарный оператор, принимающий MyStruct и возвращающий сложение его значений членов:

struct MyStruct {
  float value1;
  float value2;
};
std::vector<MyStruct> myvec;

/* fill myvec */

//C++11 with lambdas:
auto result = thrust::transform_reduce(begin(myvec), end(myvec), 
  [](MyStruct const& ms) { //unary op for transform
    return ms.value1 + ms.value2;
  },
  0, thrust::add);

//C++03 with a functor:
struct MyStructReducer {
  float operator()(MyStruct const& ms) {
    return ms.value1 + ms.value2;
  }
};

float result = thrust::transform_reduce(myvec.begin, myvec.end(), 
  MyStructReducer(), 0, thrust::add);

Вы также можете использовать бесплатную функцию вместо класса Reducer.

//C++03 with a function:
float reduceMyStruct(MyStruct const& ms) {
  return ms.value1 + ms.value2;
}

/* ... */
float result = thrust::transform_reduce(myvec.begin, myvec.end(), 
  reduceMyStruct, 0, thrust::add);

ХТН

14.02.2013
  • Это ответ на мой вопрос, спасибо. Я не знал, что вам нужно передать аргумент функции, как этот. Я использую структуру, потому что она позволяет мне заранее передавать дополнительные аргументы. 14.02.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..