gpt4 book ai didi

c++ - 以最高性能将 double vector 截断为单精度

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:46 27 4
gpt4 key购买 nike

我正在试验流体动力学代码,在某些操作中降低 float 的精度,以测试是否真的需要 double 。

为此,我编写了一个截断函数,可将 double vector 的精度降低为单精度,而无需转换数据。这使我能够评估某些函数的准确性,而无需将代码转换为单精度。由于这些评估在计算上很昂贵,我的目标是拥有一个具有尽可能高性能的截断函数。我尝试了以下方法,是否有任何方法可以提高 truncate 函数的性能?

#include <vector>
#include <iostream>
#include <iomanip>
#include <chrono>
#include <random>

void truncate(std::vector<double>& v)
{
for (double& d : v)
{
float d_float = static_cast<float>(d);
d = static_cast<double>(d_float);
}
}

int main()
{
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<double> dist(0., 1.);

const int n = 512*512*512;
std::vector<double>v(n);

for (double& d : v)
d = dist(mt);

std::cout << "Before: " << std::setprecision(15) << v[0] << std::endl;
auto start = std::chrono::high_resolution_clock::now();
truncate(v);
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now() - start);
std::cout << "After: " << std::setprecision(15) << v[0] << std::endl;
std::cout << "Duration in microseconds: " << duration.count() << std::endl;
return 0;
};

最佳答案

为了截断函数的绝对性能,您可能需要手动执行操作;假设您可以访问 OpenMP 和 SSE 内在函数,请查看 _mm_cvtpd_ps(将 2 个 double 转换为两个 float )和 _mm_cvtps_pd(转换回 double )。

类似于:

double * vec; // aligned properly
#pragma omp parallel for schedule(static, 512)
for (int i = 0; i < size; i += 2)
{
_mm_store_pd(vec + i, _mm_cvtps_pd(_mm_cvtpd_ps(_mm_load_pd(vec + i))));
}

这是我会尝试的事情;您可以尝试使用 OpenMP 选项、内在函数的确切形状(如果可用,可以使用 AVX)等。

编辑:AVX变体就是_mm256_cvtpd_ps等等,如果你能实现这个建议,你也可以实现AVX版本。

关于c++ - 以最高性能将 double vector 截断为单精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36763167/

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