在OpenMP中并行化多维尴尬并行循环的正确方法是什么?维度的数量在编译时是已知的,但是哪个维度是大的.他们中的任何一个可能是一,二或一百万.当然我不希望N omp parallel是一个N维循环......
思考:
问题在概念上很简单.只有最外层的"大"循环需要并行化,但循环维度在编译时是未知的并且可能会发生变化.
将动态设置omp_set_num_threads(1)和#pragma omp for schedule(static, huge_number)使某些环路并行化无操作?这会产生不良的副作用/开销吗?感觉像一个kludge.
在OpenMP规范(2.10,A.38,A.39)讲述整合及不符合要求的嵌套并行之间的差异,但没有提出解决这个问题的最好的办法.
可以重新排序循环,但可能会导致大量缓存未命中.展开是可能的,但不是重要的.还有另外一种方法吗?
这是我要并行化的内容:
for(i0=0; i0<n[0]; i0++) {
for(i1=0; i1<n[1]; i1++) {
...
for(iN=0; iN<n[N]; iN++) {
<embarrasingly parallel operations>
}
...
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我需要从许多Web数据提供程序中获取一些数据,这些数据提供程序不公开任何服务,因此我必须编写类似这样的内容,例如使用WWW :: Mechanize:
use WWW::Mechanize;
@urls = ('http://www.first.data.provider.com', 'http://www.second.data.provider.com', 'http://www.third.data.provider.com');
%results = {};
foreach my $url (@urls) {
$mech = WWW::Mechanize->new();
$mech->get($url);
$mech->form_number(1);
$mech->set_fields('user' => 'myuser', pass => 'mypass');
$resp = $mech->submit();
$results{$url} = parse($resp->content());
}
consume(%results);
Run Code Online (Sandbox Code Playgroud)
是否有一些(可能是简单的:-)方式将数据同时提取到一个公共的%结果变量,即:并行地从所有提供者那里获取?
我正在尝试使用D编程语言的MPI.D完全支持C ABI,可以链接并调用任何C代码.我已经完成了显而易见的事情并将MPI标题翻译为D.然后我将测试程序从维基百科翻译成D.我使用以下命令编译它:
dmd test.d -L-lmpistubs
它在我刚运行时起作用./test,并打印:
0: We have 1 processors
但是,当我跑步时mpiexec -n 8 test,它什么都不打印.我的理解是MPI可执行文件需要一堆奇怪的链接选项,这就是mpicc存在自动化过程的工具的原因.但是,如果我在D中尝试使用MPI,这对我没有帮助.我认为这是因为我没有使用正确的链接器选项.有人可以告诉我mpicc,我可以做什么以及如何让DMD做同样的事情?
编辑:我找到了答案mpicc -showme.这显示了mpicc转发的命令gcc.但是,我也意识到我做错了头文件翻译.下一个问题: 如何做对.
如果我访问同步方法或同步块内的对象,那个被访问元素中的所有对象是否也同步?
想象一下,有一个对象Queue具有同步add()和take()方法,接受并分发复杂对象Thing.Thing有很多列表与其他不同的对象.
现在,图像线程Before创建Thing并放入一些现有对象Thing,修改其中一些对象,依此类推.该Before线增加Thing至Queue.稍后一点线程After从中Thing获取Queue.
问题:Will Thing及其所有子/子对象是否处于Before离开它们的状态?即使线程After可能稍早在这些子元素中的一个上工作?因为我映像处理器的线程After可能仍然有一些关于该子元素的缓存信息(该子对象的地址仍然相同).只有通过Thing同步方式访问父对象,所有这些缓存的东西才会失效?
请不要给出使用并发库等的答案.我想了解发生了什么.
java parallel-processing concurrency synchronization monitor
Android的Java和Oracle的Java略有不同.是否可以使用以下actor或协同程序
同样适用于Android,以避免在Android的Java和Oracle的Java之间使用线程和共享更多代码?是否有其他框架可用于两个Java版本.
先感谢您.
下面是Haskell代码(HTTP)下载给定目录中缺少的文件:
module Main where
import Control.Monad ( filterM
, liftM
)
import Data.Maybe ( fromJust )
import Network.HTTP ( RequestMethod(GET)
, rspBody
, simpleHTTP
)
import Network.HTTP.Base ( Request(..) )
import Network.URI ( parseURI )
import System.Directory ( doesFileExist )
import System.Environment ( getArgs )
import System.IO ( hClose
, hPutStr
, hPutStrLn
, IOMode(WriteMode)
, openFile
, stderr
)
import Text.Printf ( printf )
indices :: [String]
indices =
map format1 [0..9] ++ map format2 [0..14] ++ ["40001-41284" :: …Run Code Online (Sandbox Code Playgroud) (require '[clojure.core.reducers :as r])
(def data (into [] (take 10000000 (repeatedly #(rand-int 1000)))))
(defn frequencies [coll]
(reduce (fn [counts x]
(merge-with + counts {x 1}))
{} coll))
(defn pfrequencies [coll]
(r/reduce (fn [counts x]
(merge-with + counts {x 1}))
{} coll))
user=> (time (do (frequencies data) nil))
"Elapsed time: 29697.183 msecs"
user=> (time (do (pfrequencies data) nil))
"Elapsed time: 25273.794 msecs"
user=> (time (do (frequencies data) nil))
"Elapsed time: 25384.086 msecs"
user=> (time (do (pfrequencies data) nil))
"Elapsed time: 25778.502 …Run Code Online (Sandbox Code Playgroud) [代码取自Mark Lutz编程Python第4版]
"forks child processes until you type 'q'"
import os
def child():
print('Hello from child', os.getpid())
os._exit(0) # else goes back to parent loop
def parent():
while True:
newpid = os.fork()
if newpid == 0:
child()
else:
print('Hello from parent', os.getpid(), newpid)
if input() == 'q': break
parent()
Run Code Online (Sandbox Code Playgroud)
运行时代码输出的内容:
Hello from parent 2057 2062
Hello from child 2062
Hello from parent 2057 2068
Hello from child 2068
Hello from parent 2057 2069
Hello from child 2069
Hello from parent …Run Code Online (Sandbox Code Playgroud) 我有一个100000对的文本文件:单词和频率.
test.in文件包含单词:
我解析这个文件并把文字放进去
Dictionary<string,double> dictionary;
Run Code Online (Sandbox Code Playgroud)
我想在以下代码中执行一些搜索+命令逻辑:
for(int i=0;i<15000;i++)
{
tempInputWord = //take data from file(or other sources)
var adviceWords = dictionary
.Where(p => p.Key.StartsWith(searchWord, StringComparison.Ordinal))
.OrderByDescending(ks => ks.Value)
.ThenBy(ks => ks.Key,StringComparer.Ordinal)
.Take(10)
.ToList();
//some output
}
Run Code Online (Sandbox Code Playgroud)
问题:此代码必须在不到10秒的时间内运行.
在我的计算机(核心i5 2400,8gb RAM)上使用Parallel.For() - 大约91秒.
更新:
万岁!我们做到了!谢谢@CodesInChaos,@ usr,@ T_D以及参与解决问题的所有人.
最终代码:
var kvList = dictionary.OrderBy(ks => ks.Key, StringComparer.Ordinal).ToList();
var strComparer = new MyStringComparer();
var intComparer = …Run Code Online (Sandbox Code Playgroud) 我在服务器上有一大堆文件,我想将它们上传到S3.这些文件以.data扩展名存储,但实际上它们只是一堆jpeg,png,zip或pdf.
我已经编写了一个简短的脚本,它找到了mime类型并将它们上传到S3上,但是它运行起来很慢.有没有办法使用gnu parallel进行下面的运行?
#!/bin/bash
for n in $(find -name "*.data")
do
data=".data"
extension=`file $n | cut -d ' ' -f2 | awk '{print tolower($0)}'`
mimetype=`file --mime-type $n | cut -d ' ' -f2`
fullpath=`readlink -f $n`
changed="${fullpath/.data/.$extension}"
filePathWithExtensionChanged=${changed#*internal_data}
s3upload="s3cmd put -m $mimetype --acl-public $fullpath s3://tff-xenforo-data"$filePathWithExtensionChanged
response=`$s3upload`
echo $response
done
Run Code Online (Sandbox Code Playgroud)
此外,我确信这个代码一般可以大大改进:)反馈提示将不胜感激.