我一直在使用OpenMP测试并行排序。我实现了比没有OpenMP快3倍的奇偶排序算法。但是,std :: sort仍然要快得多:seq-100s,并行-20s,std :: sort-0.05s
我尝试将#pragma omp并行移动到i-cycle,但效果更糟,并且没有对向量进行排序
for (int i = 0; i < 100000; i++) {
#pragma omp parallel for
for (int j = (i % 2) ? 0 : 1; j < 100000 - 1; j += 2) {
if (vec_[j] > vec_[j + 1]) {
std::swap(vec_[j], vec_[j + 1]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
TBH,我期望并行奇偶排序是最快的,但现在我想知道-我做错什么了吗,或者只是std :: sort如此有效?
想象一下,在C程序中导致段错误是常见的(也是错误的)。我是否应该知道在运行时分配的“仍然可达”指针?
我用谷歌搜索了Valgrind关于仍然可以到达的指针的观点(也阅读了其他相关的stackoverflow主题),我了解到基本上这不是一个大问题,我不必担心。但是我愿意。在C ++中,可以使用释放析构函数对其进行某种修复,该析构函数将始终根据标准进行调用。
void lose_definetly() {
int * array = calloc(4,sizeof(int));
array[3] = 1232;
}
void proper_free() {
int * array = calloc(4,sizeof(int));
array[3] = 1232;
free(array);
}
void cause_segfault() {
int * array = calloc(4,sizeof(int));
array[-1232142144] = 1232;
free(array);
}
int main() {
lose_definetly();
proper_free();
cause_segfault();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序输出预期为段错误:
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
Valgrind关于泄漏的报告:
==134== definitely lost: 16 bytes in 1 blocks
==134== indirectly lost: 0 bytes in 0 blocks
==134== possibly lost: 0 bytes in 0 blocks …Run Code Online (Sandbox Code Playgroud)