是否有可能让GHC为各代SSE代码生成SIMD代码?
例如.得到了这样的程序
import Data.Array.Vector
main = print . sumU $ (enumFromToFracU 1 10000000 :: UArr Double)
Run Code Online (Sandbox Code Playgroud)
我可以看到生成的代码(为64位x86编译)在标量模式下使用SSE指令(C和asm后端).所以加上而不是addpd.对于我工作的程序类型,使用向量指令对性能很重要.是否有一种简单的方法让像我这样的新手让GHC使用SSE SIMDize代码?
use Parallel::ForkManager;
use LWP::Simple;
my $pm=new Parallel::ForkManager(10);
our $a =0;
@LINK=( 10,203, 20, 20 ,20 ,10 ,101 ,01 ,10 ) ;
for my $link (@LINK) {
$pm->start and next;
my $lo = ($link * 120.22 )*12121.2121212121212121*( 12121212.1212121+ $link);
$a = $a+ $lo ;
print $a."\n" ;
$pm->finish;
};
print $a ;
Run Code Online (Sandbox Code Playgroud)
我试图使用并行fork Manager模块访问并行进程上的全局变量.程序结束时全局变量仍然保持不变..如何实现这一目标?是否有可能?
我正在尝试新的System.Threading.Parallel方法,如parallel for和foreach.
它们似乎工作得很好,但我需要一种方法来增加执行的并发线程数,这些线程是8(我有一个四核).
我知道有一种方法我可以找到你隐藏该死的财产的地方.
吉拉德.
我正在使用MPI(与fortran但问题是MPI标准比任何给定语言更具体),并且特别使用缓冲的发送/接收函数isend和irecv.现在,如果我们想象以下场景:
流程0:
isend(stuff1, ...)
isend(stuff2, ...)
Run Code Online (Sandbox Code Playgroud)
过程1:
wait 10 seconds
irecv(in1, ...)
irecv(in2, ...)
Run Code Online (Sandbox Code Playgroud)
消息是按照发送顺序传递给进程1的,即如果使用的标记在所有情况下都相同,我可以确定in1 == stuff1和in2 == stuff2 吗?
我写了一个用于冒泡排序算法的c ++代码,我不知道如何使用openmp使其并行,所以请帮助我.....这是代码:
#include "stdafx.h"
#include <iostream>
#include <time.h>
#include <omp.h>
using namespace std;
int a[40001];
void sortArray(int [], int);
int q=0;
int _tmain(int argc, _TCHAR* argv[])
{
int x=40000;
int values[40000];
for (int i=0;i<x;i++)
{
values[i]=rand();
}
cout << "Sorting Array .......\n";
clock_t start = clock();
sortArray(values, x);
cout << "The Array Now Sorted\n";
printf("Elapsed Time : %f\n", ((double)clock() - start) / CLOCKS_PER_SEC);
cout << "\n";
}
void sortArray(int array[], int size)
{
bool swap;
int temp;
do
{
swap …Run Code Online (Sandbox Code Playgroud) 我目前正在进行并行编程课程,我们的第一个编程练习是创建四个线程,显示"hello world"类型的消息.我想知道运行线程的核心是什么.我尝试在Unix上使用TOP命令来显示所有进程,我确实看到了5个不同的线程,但不知道如何查看运行每个线程的内核.
为什么这个代码在与std :: sort()完全正常工作时不会并行化std :: for_each()?
我如何解决它?
g++ -fopenmp -D_GLIBCXX_PARALLEL=1 -o p p.cc && time ./p sort
Run Code Online (Sandbox Code Playgroud)
Linux上的GCC 4.3.
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
void delay()
{
for(int c = 0; c < 1000000; c++) {
}
}
int lt(int a, int b)
{
delay();
return a < b;
}
void noop(int a)
{
delay();
}
int main(int argc, char **argv)
{
if (argc < 2) {
printf("%s <sort | for_each>\n", argv[0]);
return 1;
}
std::vector<int> foo(10000);
if …Run Code Online (Sandbox Code Playgroud) 好的,所以我正在做ProjectEuler问题#14,我正在摆弄优化以便感受f#out.
在以下代码中:
let evenrule n = n / 2L
let oddrule n = 3L * n + 1L
let applyRule n =
if n % 2L = 0L then evenrule n
else oddrule n
let runRules n =
let rec loop a final =
if a = 1L then final
else loop (applyRule a) (final + 1L)
n, loop (int64 n) 1L
let testlist = seq {for i in 3 .. 2 .. 1000000 do yield i }
let getAns …Run Code Online (Sandbox Code Playgroud) 我正在使用C++中的OpenMP编写一个多线程程序.有一次,我的程序分成许多线程,每个线程都需要将"作业"添加到某个容器中,以跟踪所有添加的作业.每个作业都可以是指向某个对象的指针.
基本上,我只需要同时从几个线程添加指向某个容器的指针.
有一个表现良好的简单解决方案吗?经过一些谷歌搜索,我发现STL容器不是线程安全的.一些stackoverflow线程解决了这个问题,但没有一个在简单的解决方案上形成共识.
我刚刚编写了第一个OpenMP程序,它并行化了一个简单的for循环.我在双核机器上运行代码,从1个线程到2个线程时看到了一些加速.但是,我在学校的Linux服务器上运行相同的代码,并没有看到加速.在尝试了不同的事情后,我终于意识到删除一些无用的printf语句会导致代码显着加速.下面是我并行化的代码的主要部分:
#pragma omp parallel for private(i)
for(i = 2; i <= n; i++)
{
printf("useless statement");
prime[i-2] = is_prime(i);
}
Run Code Online (Sandbox Code Playgroud)
我想printf的实现有很大的开销,OpenMP必须与每个线程重复.是什么导致了这种开销,为什么OpenMP无法克服它?
parallel-processing performance printf multithreading openmp