G++ -cilkplus 随机行为 std::vectors
G++ -cilkplus random behavior with std::vectors
GCC 系列处理以下(简化的)代码非常糟糕
#include <vector>
#include <cilk/cilk.h>
void walk(std::vector<int> v, int bnd, unsigned size) {
if (v.size() < size)
for (int i=0; i<bnd; i++) {
std::vector<int> vnew(v);
vnew.push_back(i);
cilk_spawn walk(vnew, bnd, size);
}
}
int main(int argc, char **argv) {
std::vector<int> v{};
walk(v , 5, 5);
}
具体来说:
G++ 5.3.1 崩溃:
red.cpp: In function ‘<built-in>’:
red.cpp:20:39: internal compiler error: in lower_stmt, at gimple-low.c:397
cilk_spawn walk(vnew, bnd, size);
G++ 6.3.1 创建一个代码,如果在一个内核上执行,它可以完美运行
但有时会出现段错误,如果使用更多内核,则有时会发出双重释放信号。一个学生谁
有一个 arch linux g++7 报告了类似的结果。
我的问题:该代码是否有问题。我是在调用一些
未定义的行为还是我应该报告的错误?
回答我自己的问题:
根据 https://gcc.gnu.org/ml/gcc-help/2017-03/msg00078.html,它确实是 GCC 中的一个错误。在 cilk_spawn 中,临时对象在父对象中被销毁,而不是在子对象中被销毁。所以如果真的发生thread fork,可能销毁的太早了。
GCC 系列处理以下(简化的)代码非常糟糕
#include <vector>
#include <cilk/cilk.h>
void walk(std::vector<int> v, int bnd, unsigned size) {
if (v.size() < size)
for (int i=0; i<bnd; i++) {
std::vector<int> vnew(v);
vnew.push_back(i);
cilk_spawn walk(vnew, bnd, size);
}
}
int main(int argc, char **argv) {
std::vector<int> v{};
walk(v , 5, 5);
}
具体来说:
G++ 5.3.1 崩溃:
red.cpp: In function ‘<built-in>’: red.cpp:20:39: internal compiler error: in lower_stmt, at gimple-low.c:397 cilk_spawn walk(vnew, bnd, size);
G++ 6.3.1 创建一个代码,如果在一个内核上执行,它可以完美运行 但有时会出现段错误,如果使用更多内核,则有时会发出双重释放信号。一个学生谁 有一个 arch linux g++7 报告了类似的结果。
我的问题:该代码是否有问题。我是在调用一些 未定义的行为还是我应该报告的错误?
回答我自己的问题:
根据 https://gcc.gnu.org/ml/gcc-help/2017-03/msg00078.html,它确实是 GCC 中的一个错误。在 cilk_spawn 中,临时对象在父对象中被销毁,而不是在子对象中被销毁。所以如果真的发生thread fork,可能销毁的太早了。