我的问题是关于本书中的以下短语:
不幸的是,SoA表格并非在所有情况下都是理想的.对于随机或不连贯的情况,收集用于访问数据,SoA表单可能导致额外的不需要的数据被读入缓存,从而降低性能.在这种情况下,使用AoS表单将导致更小的工作集和更高的性能.但是,通常,如果要对计算进行矢量化,则优选SoA形式.
我猜测 AoS可能导致更好性能的原因是,当同一结构中的不同或更好的所有字段都参与单个矢量化运行时.
示例(只是概念,没有具体或工作代码):
/*Note that the types of data I maintain the same intentionally,
to simplify discussion*/
struct Data {
float mean;
float distribution[10]
}
Run Code Online (Sandbox Code Playgroud)
并定义从某些数据源中随机获得的数组
Data aos[5];
现在,如果在矢量化循环期间我做了类似的事情:
float* dataPtr = &(aos[0].mean);
#pragma simd
for(int i=0; i< 60; i++)
{
const float mean = (*dataPtr);
/*do something with mean */
dataPtr++;
/*do something with distribution */
}
Run Code Online (Sandbox Code Playgroud)
这将导致更好的性能,因为在SoA的情况下,我将在高速缓存行上推送我在计算期间可能实际需要的更多信息.有些CPU预缓存?在AoS的情况下,相反会产生更好的性能.
我的假设是正确的,还是还有别的?
我正在尝试使用Julia进行一些统计分析.代码由文件组成script.jl(例如数据的初始化)和algorithm.jl.
模拟的数量很大(至少100,000),因此使用并行处理是有意义的.
下面的代码只是一些伪代码来说明我的问题 -
function script(simulations::Int64)
# initialise input data
...
# initialise other variables for statistical analysis using zeros()
...
require("algorithm.jl")
@parallel for z = 1:simulations
while true
choices = algorithm(data);
if length(choices) == 0
break
else
# process choices and pick one (which alters the data)
...
end
end
end
# display results of statistical analysis
...
end
Run Code Online (Sandbox Code Playgroud)
和
function algorithm(data)
# actual algorithm
...
return choices;
end
Run Code Online (Sandbox Code Playgroud)
例如,我想知道平均有多少选择,最常见的选择是什么,等等.为此,我需要将choices(在 for循环中)的一些数据保存到统计分析变量(在 …
假设我在ijulia的一个单元格中定义了少量函数(我使用的是JuliaBox).
我希望能够并行调用main函数n次.令人烦恼的是,主要调用我已经定义的十几个辅助函数.
我是否必须放在@everywhere所有这些辅助函数之前,还是有一些较短的语法可以工作?
例如,是否有一个命令可以将全局级别定义的所有函数共享给所有进程?或者有没有办法共享函数列表(而不是将@everywhere放在函数声明中).
我正在努力改善这段代码的执行时间.由于计算非常耗时,我认为最好的解决方案是并行化代码.
我是第一次使用这个问题中解释的地图,但后来我尝试了一种更简单的方法,认为我可以找到更好的解决方案.但是我还没有拿出任何东西,所以因为这是一个不同的问题,所以我决定把它作为一个新问题发布.
我正在使用Python 3.4在Windows平台上工作.
这是代码:
similarity_matrix = [[0 for x in range(word_count)] for x in range(word_count)]
for i in range(0, word_count):
for j in range(0, word_count):
if i > j:
similarity = calculate_similarity(t_matrix[i], t_matrix[j])
similarity_matrix[i][j] = similarity
similarity_matrix[j][i] = similarity
Run Code Online (Sandbox Code Playgroud)
这是calculate_similarity功能:
def calculate_similarity(array_word1, array_word2):
denominator = sum([array_word1[i] + array_word2[i] for i in range(word_count)])
if denominator == 0:
return 0
numerator = sum([2 * min(array_word1[i], array_word2[i]) for i in range(word_count)])
return numerator / denominator
Run Code Online (Sandbox Code Playgroud)
以及代码的解释:
word_count 是列表中存储的唯一单词的总数 …python parallel-processing multiprocessing python-multithreading python-multiprocessing
我需要做一个带温度调节模块的液压系统的流程图.但是,温度调节仅在循环的一部分期间被激活.在此部分期间,系统继续执行其他操作.
我想在流程图中表示这一点.我需要一种方法来判断并行算法何时开始以及何时在主流程图中结束.我怎么做 ?
我已经实现了一个组合搜索算法(用于与更有效的优化技术进行比较),并试图改进其运行时间parfor.
不幸的是,工作任务似乎非常不平衡.
每个子项目的i复杂程度约为nCr(N - i, 3).正如您所看到的,这些任务i < N/4涉及的工作量要大得多i > 3*N/4,但似乎MATLAB将所有i < N/4工作分配给单个工作人员.
MATLAB是否真的基于相同大小的循环范围子集来划分工作?
不,这个问题引用了文档说它没有.
有没有一种方便的方法来重新平衡这个而不需要对工作人员进行硬编码(例如,如果我在池中只需要4个工作人员,那么我可以i用两个更高的位交换两个最低位,以确保每个工作人员都能收到一些简单的混合和艰巨的任务)?
我不认为一个完整的"工作窃取"的实施是必要的,或许只是分配1,2,3,4工人,那么当4第一个完成,它的工人开始上项目5,等等.每个项目的大小足够大于我不太担心增加的通信开销的迭代次数.
我想使用openMP并行搜索算法, vTree是一个二叉搜索树,我想为每个点集应用我的搜索算法.下面是我的代码片段.两点的搜索过程完全不相关,因此可以是并行的.虽然他们确实需要读取同一棵树,但一旦构建,树就不会再被修改了.因此它是只读的.
但是,下面的代码显示了可怕的可扩展性,在我的32核平台上,只实现了2倍的加速.是因为vTree所有线程都读取了它?如果是这样,我该如何进一步优化代码?
auto results = vector<vector<Point>>(particleNum);
auto t3 = high_resolution_clock::now();
double radius = 1.6;
#pragma omp parallel for
for (decltype(points.size()) i = 0; i < points.size(); i++)
{
vTree.search(points[i], radius, results[i]);
}
auto t4 = high_resolution_clock::now();
double searchTime = duration_cast<duration<double>>(t4 - t3).count();
Run Code Online (Sandbox Code Playgroud)
类型签名search是
void VPTree::search(const Point& p, double radius, vector<Point>& result) const
Run Code Online (Sandbox Code Playgroud)
搜索结果将被放入result.
美好的一天,
可以通过多种方式实现并行执行.从严格的手动"多线程"到使用Microsoft创建的各种"帮助者".其中一个帮手是Parallel类.
我的一位同事坚持认为Parallel.ForEach(或整体的Parallel类)是"旧的",不应该使用.相反,他说,应该使用异步操作.换句话说,你应该使用Task.WhenAll()而不是Parallel.ForEach().
当被问及为什么不使用Parallel.ForEach(),时,这正是所需要的 - 并行执行多个昂贵的操作,他回答说这Parallel.ForEach()是旧的,并且Microsoft建议尽可能使用async/await.
我搜遍了MSDN和Stackoverflow以及我能找到的所有地方,但我找不到任何指向使用async/await而不是.Parallel的必要性.虽然通常可以通过交换这些工具来获得类似的结果,但这并不意味着Parallel.ForEach已经过时了.或者是吗?
任何人都有一个信誉良好的机构(MSDN?)的一些"最佳实践"或"建议"的链接,可以说这Parallel.ForEach()是逐步淘汰的,而且需要坚持创建,运行和等待任务?
请不要发布与Parallel VS Async相关的答案,因为这不是问题.
问题是:既然你可以使用async/await WhenAll(WaitAll等)使任务并行运行,那么在.NET 4.5以后它是否会使'Parallel'类过时,旧或不流行?
parallel-processing multithreading design-patterns async-await .net-4.5
可能是这么愚蠢的问题.
在这个网站上我读到了
valarray规范允许库通过多种效率优化来实现它,例如某些操作的并行化
目前std::valarray在不同平台和编译器上并行化的是什么?海湾合作委员会,VS2010/2013,铿锵?
特别是标准的线程支持C++11.
UPD:如果一些sompilers不支持此功能.执行此操作的最佳方法是:在多个线程中将一些函数应用于容器的元素?显然,天真的解决方案会很短并且运行良好std::thread但可能存在更好的解决方案?
我所看到的关于并行列表处理的大多数问题都涉及通过分块列表并将每个块彼此并行处理而实现的并行性.
我的问题不同.
关于maps和folds 的序列,我有一些更简单/更愚蠢的想法:如果我们想简单地为第一个工作设置一个map应该与第二个并行完成的工作map怎么办?
我正在考虑的计算结构:
xs -- initial data
ys = y1 : y2 : ... : yn -- y1 = f x1, ... and so on.
-- computed in one parallel job.
zs = z1 : z2 : ... : zn -- z1 = g y1, ... and so on.
-- computed in another job (the applications of `g`), i.e., the "main" job.
Run Code Online (Sandbox Code Playgroud)
以下代码的精神会有效吗?
ys = map f xs
zs = …Run Code Online (Sandbox Code Playgroud)