问题标签 [cilk-plus]
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.
c++ - Cilk Plus 代码结果取决于工人数量
我有一小段代码,我想在升级时并行化。我一直在使用cilk_for
Cilk Plus 来运行多线程。问题是我会根据工人的数量得到不同的结果。
我读过这可能是由于竞争条件造成的,但我不确定代码具体是什么导致了这种情况或如何改善它。此外,我意识到这一点long
并且__float128
对于这个问题来说太过分了,但在升级时可能是必要的。
代码:
示例输出export CILK_NWORKERS=1 && ./code.exe
:
总和概率 = 1
0.101812
示例输出export CILK_NWORKERS=4 && ./code.exe
:
sumProb = 0.948159
断言失败:(fabs(1.0 - sumProb) < 0.01),函数直接,文件 code.c,第 61 行。
中止陷阱:6
c - cilk 加数组表示法未使用 gcc 4.9.0 进行矢量化
我试图弄清楚为什么 gcc 4.9.0 在使用 gcc 4.9.0 时不会矢量化简单的数组加法,使用 -O -ftree-vectorize:
通过查看生成的汇编程序,该循环尚未被矢量化,并且使用 -fopt-info-vec-all 标志,我得到很多输出,告诉我为什么矢量化失败,首先是:
这令人费解,因为循环中没有控制流。for
使用标准数组表示法对同一操作进行循环矢量化可以正常工作。
blas - 是否有使用 cilkplus 数组表示法的 blas 实现?
令我惊讶的是,我无法在网络上跟踪任何基于 cilkplus 数组表示法的 BLAS 实现。这很奇怪,因为 cilkplus 应该确保在当今的多核工作站 CPU 上(超过)体面的性能,再加上 BLAS 算法的非常富有表现力和紧凑的表示。更奇怪的是,考虑到 BLAS/LAPACK 是密集矩阵计算的事实标准(至少,作为规范)。
我知道还有其他更新和复杂的库试图改进/扩展 blas/lapack,例如,我查看了 eigen 和 flens,但是拥有“标准”blas 的 cilkplus 版本仍然会很好执行。
这是否取决于 cilkplus 的非常有限的传播?
c++ - 任何矩阵库顺序中性?
对不起,如果这太长了,但我觉得这个问题需要澄清:
我正在为 Excel 开发一个 xll 库,即一个包含可以注册并直接从单元格中调用的函数的 C 库。理想情况下,这些函数也应该从 VBA 调用(或调整为调用),以便为不适合 Excel 工作表的更复杂的计算(求根、ode、优化)提供解释环境。需要明确的是:有一种方法可以从 vba 调用工作表函数(函数 Application.Run),但它为所有参数和返回值从/到变体类型的转换付出了不可接受的代价。现在有趣的情况是,在同一个 Excel 环境中,二维矩阵以不同的方式传递:
对于工作表函数,本机 Excel-C 接口以行优先顺序向 C 传递一个矩阵(Excel SDK 的 FP12 类型);
对于 vba,矩阵是 LPSAFEARRAY,它的数据以列优先顺序组织。
对于一维数据(向量),有一个可以追溯到 BLAS(30 年前)的解决方案,可以将其转换为 C,具有类似的结构
换句话说,我们使用不拥有数据的中间结构进行计算,但可以映射连续数据或以恒定间隙(步幅)线性间隔的数据。Struct 的数据可以按顺序处理,但也可以转换为数组部分(如果使用 cilk):
当我们从向量转移到矩阵时,我读到可以使用行跨度和列跨度从矩阵顺序中抽象出来。我的天真尝试可能是:
来自 FP12 或 LPSAFEARRAY 的两个构造函数初始化指向以行为主或列为主组织的数据的结构。这是订单中性吗?在我看来是的:数据访问(索引)和行/列选择都是正确的,独立于顺序。考虑到两次乘法,索引速度较慢,但可以非常快速地映射行和列:毕竟矩阵库的目的是最小化单个数据访问。此外,编写为行或列以及整个矩阵返回数组部分的宏非常容易:
在上面的代码中,索引从 1 开始,但即使这样也可以使用(可修改的)ofs 0-1 参数来代替硬编码的 1。all() 函数/FULL() 宏仅对整体正确,连续矩阵,而不是子矩阵。但是这也可以调整,在这种情况下切换到行上的循环。或多或少类似于上面的 copyFrom 方法(),它可以在行优先和列优先表示之间转换(复制)矩阵。
还要注意 TranspInPlace 方法:通过交换 rows/cols 和 rowstride/colstride,我们可以对相同的未触及数据进行逻辑转置,这意味着不再需要将逻辑开关传递给通用例程(例如,用于矩阵乘法的 GEMM ,尽管(公平地说)这不包括共轭转置的情况)。
鉴于上述情况,我正在寻找一个实现这种方法的库,以便我可以使用(挂钩)它,但我到目前为止的搜索并不令人满意:
GSL Gsl 使用行优先顺序。停止。
LAPACK 本机代码是列优先的。C 接口提供了处理主要行数据的可能性,但只需添加定制代码或(在某些例程中)在对矩阵进行操作之前物理转置矩阵。
EIGEN 作为一个模板库,它可以同时处理两者。不幸的是,矩阵顺序是模板的参数,这意味着每个矩阵方法都会被复制。它有效,但并不理想。
如果图书馆更接近我所追求的,请告诉我。谢谢。
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?
c++ - 将值从减速器向量高效移动到另一个向量 [Cilk+]
如何有效地将值从减速器向量复制到另一个向量,如下所示?
是否可以使用 SIMD 指令更有效地执行上述复制?
c++11 - G++ -cilkplus 带有 std::vectors 的随机行为
以下(简化的)代码被GCC系列处理得很糟糕
具体来说:
G++ 5.3.1 崩溃:
/li>G++ 6.3.1 创建了一个代码,如果在一个内核上执行但有时会出现段错误,则该代码运行良好,如果使用更多内核,则在其他时候发出双重释放信号。一个拥有arch linux g++7的学生报告了类似的结果。
我的问题:该代码有问题吗?我是在调用一些未定义的行为还是只是我应该报告的错误?
c++ - Cilk plus 使用 JetBrains Clion IDE (C++) 进行注释
我需要在我的 C++ 程序中使用 cilk plus 注释,例如:
我正在使用 JetBrains CLion IDE,在宏替换后出现错误 Error: can't resolve type '_Cilk_spawn'。我想知道是否有任何解决方案。当然,直接从我的终端使用 g++,我只需添加选项 -fcilkplus,但在这种情况下,我不知道如何解决这个问题。这是我的 CMakeLists.txt 文件的内容(更新):
这是构建输出(更新):
c++ - C++(cilk 加代码):分段错误 11
我下载了 Intel Parallel Studio 然后去命令输入:
后跟:icpc file.cpp
运行 Cilk plus 文件。
file.cpp 是 cilkplus.org 中使用的原始示例的简化版本,因此它应该可以工作,但会产生分段错误
这是我尝试使用 cilk plus 编译器运行的文件: