gpt4 book ai didi

c++ - 为什么从具有较大数组的SIMD内部函数中获得相对于标量的较大相对加速?

转载 作者:行者123 更新时间:2023-12-01 14:40:00 24 4
gpt4 key购买 nike

我想学习SIMD编程。现在,我的代码中有了一些有趣的时刻。

我只想衡量代码的工作时间。我尝试为具有特定大小的数组应用一些基本函数。

首先,我尝试使用SIMD指令编写的函数,然后尝试使用通常的方法。而且我比较这两个实现相同功能的时间。

我定义了性能((没有sse的时间)/(使用sse的时间))。

但是当我的大小为8时,我的性能为1.3,而当我的大小为512-我的性能为3,如果我的大小= 1000,性能= 4,如果大小= 4000->性能= 5。

我不明白为什么数组大小增加时性能会增加。

我的密码

void init(double* v, size_t size) {
for (int i = 0; i < size; ++i) {
v[i] = i / 10.0;
}
}

void sub_func_sse(double* v, int start_idx) {
__m256d vector = _mm256_loadu_pd(v + start_idx);
__m256d base = _mm256_set_pd(2.0, 2.0, 2.0, 2.0);
for (int i = 0; i < 128; ++i) {
vector = _mm256_mul_pd(vector, base);
}
_mm256_storeu_pd(v + start_idx, vector);
}

void sub_func(double& item) {
for (int k = 0; k < 128; ++k) {
item *= 2.0;
}
}

int main() {
const size_t size = 8;
double* v = new double[size];
init(v, size);
const int num_repeat = 2000;//I should repeat my measuraments
//because I want to get average time - it is more clear information
double total_time_sse = 0;
for (int p = 0; p < num_repeat; ++p) {
init(v, size);
TimerHc t;
t.restart();
for (int i = 0; i < size; i += 8) {
sub_func_sse(v, i);
}
total_time_sse += t.toc();
}

double total_time = 0;
for (int p = 0; p < num_repeat; ++p) {
init(v, size);
TimerHc t;
t.restart();
for (int i = 0; i < size; ++i) {
sub_func(v[i]);
}
total_time += t.toc();
}
std::cout << "time using sse = " << total_time_sse / num_repeat << std::endl <<
"time without sse = " << total_time / num_repeat << std::endl;
system("pause");
}

最佳答案

I defined performance like (time without sse) / (time using sse).



您衡量的是加速。

可以通过应用并行化获得的加速由 Amdahl's law建模。它将那些可以更快(通过并行化或其他方式)制造的零件所节省的成本与总加速相关。阿姆达尔定律可能会令人生畏,因为它基本上说,更快地制造零件并不一定总能提高您的整体速度。可实现的加速限制由可并行化的工作负载的相对比例确定。

Gustavon's law有不同的观点。简而言之,它指出您只需增加工作量即可有效地使用并行化。总的来说,更多的工作负载通常对并行化和计算的非并行部分的开销的影响较小,因此(根据阿姆达尔定律)可以更有效地利用并行性。

...从某种意义上讲,这就是您在这里观察到的。数组越大,并行化的影响越大。

PS:这只是一些手工的解释,为什么您看到的效果并不令人惊讶。幸运的是,还有另一个答案可以更详细地解决您的特定基准。

关于c++ - 为什么从具有较大数组的SIMD内部函数中获得相对于标量的较大相对加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59703162/

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