gpt4 book ai didi

c++ - 如何使用 OpenMP 实现 argmax?

转载 作者:太空宇宙 更新时间:2023-11-04 02:52:32 24 4
gpt4 key购买 nike

我正在尝试使用 OpenMP 实现 argmax。如果简短的话,我有一个计算浮点值的函数:

double toOptimize(int val);

我可以得到最大化值的整数:

double best = 0;
#pragma omp parallel for reduction(max: best)
for(int i = 2 ; i < MAX ; ++i)
{
double v = toOptimize(i);
if(v > best) best = v;
}

现在,如何获取最大值对应的值i

编辑:

我正在尝试这个,但想确保它是有效的:

double best_value = 0;
int best_arg = 0;
#pragma omp parallel
{
double local_best = 0;
int ba = 0;
#pragma omp for reduction(max: best_value)
for(size_t n = 2 ; n <= MAX ; ++n)
{
double v = toOptimize(n);
if(v > best_value)
{
best_value = v;
local_best = v;
bn = n;
}
}
#pragma omp barrier
#pragma omp critical
{
if(local_best == best_value)
best_arg = bn;
}
}

最后,我应该有 best_arg toOptimize 的 argmax。

最佳答案

您的解决方案完全符合标准。无论如何,如果您愿意添加一点语法糖,您可以尝试如下操作:

#include<iostream>

using namespace std;

double toOptimize(int arg) {
return arg * (arg%100);
}

class MaximumEntryPair {
public:

MaximumEntryPair(size_t index = 0, double value = 0.0) : index_(index), value_(value){}

void update(size_t arg) {
double v = toOptimize(arg);
if( v > value_ ) {
value_ = v;
index_ = arg;
}
}

bool operator<(const MaximumEntryPair& other) const {
if( value_ < other.value_ ) return true;
return false;
}

size_t index_;
double value_;
};



int main() {
MaximumEntryPair best;
#pragma omp parallel
{
MaximumEntryPair thread_local;
#pragma omp for
for(size_t ii = 0 ; ii < 1050 ; ++ii) {
thread_local.update(ii);
} // implicit barrier
#pragma omp critical
{
if ( best < thread_local ) best = thread_local;
}

} // implicit barries
cout << "The maximum is " << best.value_ << " obtained at index " << best.index_ << std::endl;
cout << "\t toOptimize(" << best.index_ << ") = " << toOptimize(best.index_) << std::endl;
return 0;
}

关于c++ - 如何使用 OpenMP 实现 argmax?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20618258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com