我有以下代码。 bitCount
函数只计算64位整数中的位数。 test
函数是我在更复杂的代码中做类似事情的示例,其中我试图复制它如何使写入矩阵显着降低for循环性能,并且我正在尝试找出为什么会这样,以及是否有任何解决方法。
#include <vector>
#include <cmath>
#include <omp.h>
// Count the number of bits
inline int bitCount(uint64_t n){
int count = 0;
while(n){
n &= (n-1);
count++;
}
return count;
}
void test(){
int nthreads = omp_get_max_threads();
omp_set_dynamic(0);
omp_set_num_threads(nthreads);
// I need a priority queue per thread
std::vector<std::vector<double> > mat(nthreads, std::vector<double>(1000,-INFINITY));
std::vector<uint64_t> vals(100,1);
# pragma omp parallel for shared(mat,vals)
for(int i = 0; i < 100000000; i++){
std::vector<double> &tid_vec = mat[omp_get_thread_num()];
int total_count = 0;
for(unsigned int j = 0; j < vals.size(); j++){
total_count += bitCount(vals[j]);
tid_vec[j] = total_count; // if I comment out this line, performance increase drastically
}
}
}
这段代码需要大约11秒钟才能运行。如果我注释掉以下代码:
tid_vec[j] = total_count;
代码运行需要大约2秒钟。在我的情况下,为什么写入矩阵会影响性能呢?
bitcount
被廣泛稱為popcnt
,並已被優化至極致。 - Zulan