问题标签 [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++ - 英特尔 MIC 上的英特尔 TBB 和 Cilk Plus 线程关联
我想使用 Intel TBB 和 Cilk Plus 为 Intel Xeon Phi 编写并行代码,但我遇到了线程关联性问题。我想将一个线程绑定到一个逻辑核心。是否可以像在 OpenMP 中一样设置亲和力?我的意思是 KMP_AFFINITY="compact"。先感谢您。:)
c++ - 将 Cilk Plus 与 MinGW-w64 (gcc 4.9.2) 一起使用?
是否可以将Cilk Plus与MinGW-w64一起使用 (x86_64-4.9.2-posix-sjlj-rt_v3-rev0) 一起使用?
当我不使用-fcilkplus
选项时,编译器会给我一个错误"-fcilkplus must be enabled to use '_Cilk_spawn'"
- 很明显它可以识别扩展关键字。另一方面,在编译器安装文件夹中没有任何痕迹,'cilk.h'
也没有任何其他文件包含"cilk"
在它的名称中。
如果使用 options 编译-fcilkplus -lcilkrts
,我会得到一个错误:
"libcilkrts.spec: No such file or directory"
.
编译自Code::Blocks,错误日志:
MinGW 和 TDM-MinGW 都使用较旧的 gcc 版本(4.8 系列),因此它们无法识别cilk
关键字。
arrays - Why does this Cilk Array Notation matrix perform nearly twice as slow as the serial version?
I'm benchmarking matrix multiplication performance for serial and Cilk array notation versions. The Cilk implementation takes nearly twice as long as the serial and I don't understand why.
This is for single core execution
This is the meat of the Cilk multiplication. Due to rank restrictions, I must store each multiplication in an array then __sec_reduce_add
this array before setting the destination matrix element value.
I understand caching concerns and don't see any reason for the Cilk version to have fewer cache hits than the serial because they both access a column array that is hopefully in cache along with a series of misses for row elements.
Is there an obvious dependency that I'm overlooking or syntactic element of Cilk that I should be using? Should I be using Cilk in a different way to achieve maximum performance for non-block matrix multiplication using SIMD operations?
I'm very new to Cilk so any help/suggestion is welcome.
EDIT:
Here's the serial implementation:
Memory is (de)allocated appropriately and multiplication results are correct for both implementations. Matrix sizes are not known at compile time and a variety are used throughout the benchmark.
Compiler: icpc (ICC) 15.0.0 20140723
Compile flags: icpc -g Wall -O2 -std=c++11
Ignore the use of allocated memory, conversion from vectors to vanilla arrays, etc. I hacked apart another program to run this on a hunch assuming it'd be simpler than it in fact turned out to be. I couldn't get the compiler to accept cilk notation on both dimensions of the 2D vectors so I decided to use traditional arrays for the sake of the benchmark.
Here are all the appropriate files:
MatrixTest.cpp
Matrix.h
Matrix.cpp
c++ - Xeon phi 卸载模式如何利用线程并行和矢量化
我正在使用 cilk plus 和卸载对 Xeon phi 进行一些性能测试。
在一个简单的向量添加程序中,我有两种方法可以做到:
使用 cilk_for 将任务拆分到 Xeon phi 中的不同线程:
/li>使用矢量注释:
/li>
我的测试表明,第一种方式在至强 phi 上比第二种方式快约 10 倍。当我不卸载并在 Xeon E5 主机 CPU 上运行它时,也会发生同样的情况。
首先我想知道我的理解是否正确:
第一种方法仅利用 XEON phi 中的线程并行性(60 核 * 4 线程每个)。但不会执行向量运算。
第二种方法只利用向量化,它只会在一个线程中运行此代码并使用 SIMD(IMCI) 指令。
其次,我想知道编写此代码的正确方法是什么,这样它既可以将任务拆分到不同的线程,又可以在 Xeon phi 上使用向量指令?
提前致谢。
c++ - 可以从具有不同分配器的 stl 容器构造吗?
说我有
我在 Cilk Plus 中使用 __offload::shared_allocator 作为 allocator2 从主机 CPU 卸载到 Xeon Phi 协处理器
我可以从 B 构造 A 吗?
更一般地说,不同分配器对哪种 STL 函数很重要?
c++ - 在 Cilk 共享函数中使用 Cilk 减速器
您好,我正在尝试使用 _Cilk_Shared 和 _Cilk_offload 将一些并行工作卸载到 MIC。
我声明了一个 Cilk 共享函数:
在 main 我调用这个函数使用
在这个函数中,所有东西都应该被卸载到 MIC;
我想在 somefun 中声明一个 Cilk 减速器,这样我就可以使用 cilk_for 并附加到一个 cilk 减速器列表中,
但我得到错误:
我知道我可以使用 offload pragma 来做到这一点,所以我应该也可以使用 cilk shared 来做到这一点,对吧?
我找不到使用 _Cilk_shared 和 _Cilk_offload 的具体示例。
提前致谢
c++ - 为什么使用 _Cilk_offload 卸载希望每个函数都是 _Cilk_shared?
我已将一些全局变量声明为 _Cilk_shared。它们用于我要卸载的功能中它们也用于我不想卸载的某些功能中。
所以最初我只将那些需要卸载的函数声明为_Cilk_shared,并使用_Cilk_offload 调用这些函数。
它编译得很好。当我在主机上运行它时,它只会给出正确的结果。
然后我用 MIC 运行它。它给了我关于无法加载库 blablabla 未定义符号的运行时错误,后跟我没有声明为 _cilk_shared 的函数名称。这些函数也不需要 _cilk_shared。
所以我必须把这些函数改成_cilk_shared。再次运行它。这次 MIC 给出了正确的结果。
我检查了这些函数(我不想卸载并且最初没有声明为 _cilk_shared )是否被卸载,通过使用
结果是它们没有被卸载....
所以我想知道为什么它要我将这些函数声明为_Cilk_shared?
c++ - 基本 OpenMP 并行程序未按预期扩展
export OMP_NUM_THREADS=4
icpc -Ofast -fopenmp -g dummy.cpp -o dummy
/usr/bin/time -v ./dummy 115000 20000
- CPU% = 225%(应该是 380%+)
我对 OpenMP 和 CilkPlus 相当有经验,但在这里扩展的障碍让我望而却步,这是一个相当初级的程序。我知道它必须是显而易见的,但我觉得我已经消除了所有的数据危害和控制危害。我完全被难住了。
c++ - Ubuntu 中的 Cilk Plus
我正在尝试在 Ubuntu 15.04 中测试以下代码。
我收到以下错误。似乎 g++ 命令可以检测到 cilk plus 但无法以某种方式编译。
c++ - 如何在 Cilk Plus 中组织非线程安全资源池(每个工作人员一个资源)?
我有一个串行代码,我想使用 Cilk Plus 并行化;主循环对不同的数据集重复调用一个处理函数,所以迭代是相互独立的,除了使用了非线程安全的资源,它被封装在nts
一个外部库提供的类中(比如,)它接受一个文件名并对其进行 I/O。
如果我使用的是 OpenMP,我将创建一个资源池,其中包含与我拥有的线程一样多的资源,并根据线程 ID 访问这些资源:
__cilkrts_get_nworkers()
使用 Cilk Plus,我可以使用和API做尽可能多的事情__cilkrts_get_worker_number()
,但是从英特尔论坛上的多个帖子中,我了解到这被认为是解决问题的错误解决方案,而正确的解决方案是使用持有人超对象。
现在,持有者解决方案看起来确实不错,除了我真的希望创建与工作线程一样多的视图。也就是说,对于 3 个工作线程,我想要 3 个对象而不是更多。理由是,正如我所说,资源是由第三方库提供的,构建起来非常昂贵,而且我必须在之后处理生成的文件,所以越少越好。
不幸的是,我发现持有者不是为每个工作人员创建一个视图并保持它直到同步,而是根据我不理解的逻辑以某种方式创建和销毁视图,并且似乎没有办法影响这种行为。
是否有可能让持有人按照我想要的方式行事,如果没有,我的问题的惯用 Cilk Plus 解决方案是什么?
这是我用来调查持有者的程序,请注意,它在一次运行期间在我的测试机器上创建多达 50 个视图,这些视图似乎是随机分配和销毁的: