我正在試驗流體動力學代碼,在某些操作中降低浮點數的精度以測試是否真的需要雙精度。爲此,我寫了一個截斷函數,它將雙精度向量的精度降低到單精度,而不用轉換數據。這使我可以評估某些功能的準確性,而無需將代碼轉換爲單精度。由於這些評估的計算量很大,因此我的目標是儘可能提高性能的截斷功能。我嘗試了以下方法,有沒有什麼方法可以提高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;
};
我不明白。你爲什麼認爲將double函數轉換爲float函數然後再轉換成double函數會提高計算性能? –
我將編輯該問題。在考慮使代碼的精度變得很靈活的(大)痛苦之前,我想測試一下截斷精度的影響,以估計精度損失。爲此,我不得不重複一些昂貴的模擬,因此我想要一個快速的截斷函數。 – Chiel
我想我看到你的困惑。數學運算在'float'上比在'double'上便宜。變量的*值*(除了一些我不會涉及的邊緣情況)對性能沒有影響,只有*類型*有。所以你想將* double的vector轉換成float的vector,然後在那個上運行你的計算來看看性能的差異。這需要改變類型。 –