我對openmp沒有太多經驗。OpenMP for loop和指針
是否可以通過使用for循環而不是索引而使下面的代碼更快?
有沒有辦法讓下面的代碼更快?
該代碼將數組乘以常量。
謝謝。
代碼:
#include <iostream>
#include <stdlib.h>
#include <stdint.h>
#include <vector>
using namespace std;
int main(void){
size_t dim0, dim1;
dim0 = 100;
dim1 = 200;
std::vector<float> vec;
vec.resize(dim0*dim1);
float scalar = 0.9;
size_t size_sq = dim0*dim1;
#pragma omp parallel
{
#pragma omp for
for(size_t i = 0; i < size_sq; ++i){
vec[i] *= scalar;
}
}
}
串行指針循環
float* ptr_start = vec.data();
float* ptr_end = ptr_start + dim0*dim1;
float* ptr_now;
for(ptr_now = ptr_start; ptr_now != ptr_end; ++ptr_now){
*(ptr_now) *= scalar;
}
循環中只有20,000個值,並且CPU同步也有一些開銷。你有沒有測量循環有多快,沒有OMP?你能分享這些結果嗎? –
實際的數組比這個大得多。我也想知道如果我做了一些傷害性能的東西,因爲我也會在其他地方使用openmp。 – rxu
真正生成的代碼可能與您寫的代碼有所不同。您是否通過所有優化反彙編了發佈程序? P.S .:你的OpenMP允許你使用'size_t'作爲索引類型嗎? – ilotXXI