Я написал ниже код, чтобы проверить различные варианты 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
Почему std :: execution :: par_unseq медленно по сравнению с другими параллельными параметрами ⇐ C++
Программы на C++. Форум разработчиков
1752059953
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[i];
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79695505/why-is-stdexecutionpar-unseq-slow-compared-with-other-parallel-options[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия