问题标签 [cilk]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
415 浏览

cilk - How to break out of for loop in cilk?

the for loop looks like this:

Then when compiling, i got this error:

0 投票
1 回答
107 浏览

c - 看似任意变化的数组元素[并行快速排序/前缀和]

所以我正在使用 Cilk 在 C 中实现并行快速排序,我遇到了一个奇怪的问题。我的代码的相关部分,供参考(并提前道歉):

现在,当我在一个包含 50 个元素的测试用例上运行它时(为了便于调试,依次进行),我在递归中深入一层,然后遇到一个分段错误,这似乎是由行equalList[equalIndex[i]] = array[i];

进一步检查,在分配 equalIndex 之后,其中的值是完全任意的。这是可以预料的;我还没有分配任何东西。prefixSum 在一个元素列表上调用,除了倒数第二个元素,它是 1 之外的元素都为零。(这是一个标记元素等于枢轴的位图。)它将前缀求和运算的结果放入 equalIndex 中,我将其作为指向数组的指针传入,以便结果在调用之外持续存在。

完成此操作后,调试 printf 命令显示 equalIndex 现在全为零,除了最后两个元素,它们都是一。这是预期的前缀和结果;到目前为止,一切都很好。prefixScan 是一个简单的辅助函数,可以帮助我从零开始处理索引;它将给定数组中的所有元素向右移动一个空格,用零填充第一个元素。将 equalIndex 传递给 this 后,调试语句显示 equalIndex 除了最后一个元素为 1 之外全为零。

问题出现的地方紧随其后,在 cilk_for 循环中,将每个元素复制到其正确的数组中。在这个循环的主体中,printf 语句现在显示的值与之前的值完全不匹配——有些是正确的零,有些是我之前看到的那种非常大的正整数或负整数,在我用 prefixSum 初始化这个数组之前. 一旦它达到这些极值之一并尝试将其用作数组索引,程序就会崩溃。

我最好的猜测是,不知何故,equalIndex 中的值没有被正确分配(因此出现了奇怪的行为,就好像我没有初始化数组一样),但我很难弄清楚到底哪里出了问题。

0 投票
1 回答
322 浏览

c - 在 GCC5.2.0 中编译 Cilk plus

有人知道如何在 gcc5.2.0 中使用 Cilk plus 正确编译以下代码吗?使用 gcc -fcilkplus * 或 g++,我总是会出错。

结果:

网上关于这个的话题很少。谢谢

0 投票
2 回答
305 浏览

c - 使用 Cilk 嵌套并行执行

我正在尝试实现一个操纵矩阵的二维模板算法。对于矩阵中的每个字段,将其上、下、左、右的字段相加并除以 4 以计算新值。对于给定的矩阵,这个过程可能会重复多次。

该程序是用 C 语言编写的,并使用 cilkplus gcc 二进制文件进行编译。

**编辑:我认为您可能对编译器标志感兴趣:

请注意,实际代码涉及一些指针算法以保持一切一致。顺序实现有效。我在这里省略了这些步骤以增强可理解性。

伪代码看起来像这样(没有边缘情况处理):

然后将模板计算本身移至函数apply_stencil(...)

并尝试并行化:

Floating point exception此版本编译时没有错误/警告,但在执行时会直接产生一个。如果您想知道:将哪个 for 循环制成 cilk_for 循环并不重要。所有配置(除了没有 cilk_for)都会产生相同的错误。

可能的其他方法:

这会在编译时产生 3 个警告:i, j并且k似乎未初始化。尝试执行时,执行该matrix = result_matrix;步骤的函数似乎未定义。

现在是实际问题:Cilk 为什么以及如何破坏我的顺序代码;或者更确切地说,我怎样才能阻止它这样做?

如果您有兴趣,实际代码当然也可用。然而,这个项目是针对大学课程的,因此会受到其他学生的抄袭,这些学生发现了这个线程,这就是为什么我不想公开分享它。

**更新:

正如建议的那样,我尝试仅使用 1 个工作线程运行该算法,从而有效地使 cilk 实现顺序化。令人惊讶的是,这确实很好。但是,一旦我将工人的数量更改为两个,熟悉的错误就会返回。

我不认为这种行为是由竞争条件引起的。由于工作矩阵在每次迭代后都会更改cilk_sync并被调用,因此实际上没有临界区。所有线程不依赖于其他人在同一迭代中写入的数据。

我将尝试的下一步是尝试其他版本的 cilkplus 编译器,看看它是否可能是他们一方的错误。

0 投票
1 回答
136 浏览

c++ - 在 Mac OS X (El Capitan) 上安装 Cilk Plus 时出错

在此处输入图像描述我在 Mac OS X 上安装 CilkPlus 时遇到了问题。在安装页面之后,我按以下顺序执行了以下命令:

然后,

然而,它以错误结束。错误日志 ErrorLog3。如果有人可以让我知道我错在哪里,那就太好了。我正在尝试编译和执行 CilkPlus 代码。

0 投票
1 回答
512 浏览

visual-studio-2015 - 包括 Visual Studio 2015 中的 Cilk

如何在 Visual Studio 2015 中包含用于并行编程的 Cilk?因为只有 Visual Studio 2010 的默认安装。

0 投票
2 回答
1016 浏览

c - 读取文件到共享内存

我正在读取一个二进制文件,我想通过 Cilk 和共享内存直接卸载到 Xeon Phi。

由于我们每次都读取相当多的数据和二进制数据,因此首选的选项是使用 fread。

所以如果我做一个非常简单的例子,它会像这样

该示例与真实代码非常简化,但足以举例说明行为。

然后此代码将返回

但是,如果我们将 fread 换成 fgets (不太适合读取二进制数据,特别是返回值),事情就会很好。

那就是我们切换fgets((char *) buf, 2073600, infile);然后从我们得到的打印输出中删除 len

first value of buf is 46

这符合我们的需要,我可以_Offload_cilk在带有 buf 作为参数的函数上运行并对其进行处理。

有什么我遗漏的东西或者是不支持的吗?我试图从英特尔和互联网上的其他网站上找到尽可能多的信息,但遗憾的是我无法找到。

- - 编辑 - -

在对此进行更多研究之后,似乎在共享内存上运行 fread 并且其值高于 524287(524287 正好是 19 位) fread 会从上面得到错误。在 524287 或更低的情况下,您可以运行任意数量的 fread 并读取所有数据。

我完全找不到任何理由为此写在任何地方。

0 投票
2 回答
404 浏览

for-loop - Cilk 错误预期在 ';' 之前 ')' 令牌

我尝试使用 cilk 编译程序,但它不起作用

这是代码:

谢谢你的帮助

0 投票
1 回答
194 浏览

scheduling - Cilk工作窃取性能

我正在阅读描述 Cilk 窃取调度性能的工作的论文。

1)我的理解是调度程序不知道关键路径的任务,但只是试图在任何情况下通过窃取任务图中不“深”的任务来维持其执行。那是对的吗?

2)此外,Cilk 窃取调度程序的工作是否假设所有任务都具有相似的复杂性?如果任务的复杂性不统一,是不是调度器在实现最佳性能(即最佳负载平衡)方面的灵活性会降低?

0 投票
0 回答
92 浏览

c++ - CilkPlus:未缓存对齐的减速器向量

我正在使用 Cilk 和自定义减速器,如下所述:https ://software.intel.com/en-us/node/522608 。在他们的示例中,他们使用 reducer 在链表中进行追加操作。

现在,我想创建一个减速器向量(使用std::vector);但是,我收到以下运行时错误:

查看评论后(第 948 行:https ://github.com/Nyks45/Toolchain/blob/master/lib/gcc/x86_64-unknown-linux-gnu/5.3.1/include/cilk/reducer.h )我意识到我需要使用“新型”减速器来解决这个问题,这样它们就不一定是缓存对齐的。但是,我找不到任何关于如何创建“新型”减速器的文档/示例。

如何为上述链表示例创建一个自定义的“新型”reducer?