Почему std :: execution :: par_unseq медленно по сравнению с другими параллельными параметрамиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему std :: execution :: par_unseq медленно по сравнению с другими параллельными параметрами

Сообщение Anonymous »

Я написал ниже код, чтобы проверить различные варианты SIMD для Monte Carlo Progam. Результат выясняется, что std :: execution :: par_unseq дал самый медленный результат.

main.cpphy#include "aligned_allocator.h"
#include
#include
#include
#include // For C++17 parallel policies, or use simd with experimental::simd in C++23
#include
#include // AVX intrinsics
#include
#include
#include
#include

typedef std::vector AlignedVector;

// Black-Scholes European Call Option pricing via Monte Carlo
float black_scholes_mc_scalar(int N, float S0, float K, float T, float r,
float sigma, const AlignedVector &z) {

double payoff_sum = 0.0f;
float drift = (r - 0.5f * sigma * sigma) * T;
float diffusion = sigma * std::sqrt(T);
for (int i = 0; i < N; ++i) {
float Z = z;
float ST = S0 * std::exp(drift +
diffusion);
payoff_sum += std::max(ST - K, 0.0f);
}
return std::exp(-r * T) * (payoff_sum / N);
}

// Parallel version of black_scholes_mc_scalar
float black_scholes_mc_parallel(int N, float S0, float K, float T, float r,
float sigma, const AlignedVector &z) {

std::vector payoff(N);
float drift = (r - 0.5f * sigma * sigma) * T;
float diffusion = sigma * std::sqrt(T);
std::transform(std::execution::par, z.begin(), z.end(), payoff.begin(),
[&](float z) {
float ST = S0 * std::exp(drift+diffusion);
return std::max(ST - K, 0.0f);
});

double sum = std::reduce(std::execution::par, payoff.begin(), payoff.end());
return std::exp(-r * T) * (sum / N);
}

float black_scholes_mc_parallel_unseq(int N, float S0, float K, float T, float r,
float sigma, const AlignedVector &z) {

std::vector payoff(N);
std::transform(std::execution::par_unseq, z.begin(), z.end(), payoff.begin(),
[&](float z) {
float ST = S0 * std::exp((r - 0.5f * sigma * sigma) * T +
sigma * std::sqrt(T) * z);
return std::max(ST - K, 0.0f);
});

double sum =
std::reduce(std::execution::par_unseq, payoff.begin(), payoff.end());
return std::exp(-r * T) * (sum / N);
}

namespace stdx = std::experimental;

float black_scholes_mc_simd_c23(size_t N, float S0, float K, float T, float r,
float sigma, const AlignedVector &Z) {
using simd_t = stdx::native_simd;
constexpr std::size_t W = simd_t::size(); // SIMD width

simd_t sum = 0.0f;
size_t i = 0;

float drift = (r - 0.5f * sigma * sigma) * T;
float diffusion = sigma * std::sqrt(T);

for (; i + W

Подробнее здесь: https://stackoverflow.com/questions/796 ... el-options
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»