阅读本文:Hitchhiker的并发指南,更具体地说,关于Amdahl定律的部分- 并行程序的速度与其最慢的部分一样快,并且程序从一开始就越平行就越快.引入更多内核,我发现自己在想:如何确保从头开始编写尽可能并行的代码?如何确保我的代码能够获得添加多个内核的最大好处?而且,哪种操作会导致代码不并行,或者并行代码变慢?代码示例当然会受到赞赏.
内核级线程(如Linux和某些*BSD系统)还是其他什么?如果有任何差异,我正在使用pthreads.
我是一个插入并行编程的新手.根据我的理解,我尝试自己编码.然后我发现,我在MPI_Gather中不理解.让我们先看看代码,然后再解释.
#include "mpi.h"
#include <stdio.h>
int main (int argc, char *argv[]) {
int size;
int rank;
int a[12];
int i;
int start,end;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if(rank==0)
{
for(i=0;i<12;i++)
{
a[i] = 100;
}
}
start = 12/size*rank;
end = 12/size*(rank+1);
for(i=start;i<end;i++)
{
a[i] = rank;
printf("rank %d set a[%d] equal to %d\n",rank,i,rank);
}
MPI_Gather(&a[start],12/size*rank,MPI_INT,a,12/size*rank,MPI_INT,0,MPI_COMM_WORLD);
if(rank==0)
{
for(i=0;i<12;i++)
{
printf("%d %d\n",i,a[i]);
}
}
MPI_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于此代码,我的目标是收集在每个进程中生成的子数组中的值,并将其保存在数组a中.然后让进程0打印它.
首先,我将数组中的所有值初始化为100
然后,我计算每个过程的起始索引和结束索引(在这种情况下,过程的数量多为12的倍数)
接下来,我将值赋给等于它的数组
接下来,我收集它
最后,我将它打印在屏幕上
这是3个大小= 3的过程的输出
等级2设置[8]等于2
等级2设置[9]等于2
等级2设置[10]等于2 …
PSRS分析(定期抽样并行分类)在计算部分.为什么对常规样本进行排序的大小:O(p ^ 2 log p ^ 2)= O(p ^ 2 log p)?谢谢你的回答.
所以我在c#4.0 WPF应用程序中工作并使用并行foreach循环使用我创建的数据库存储库将数据导出到数据库.我已经使用进度条使用并行foreach进行导出,但是希望能够提供更多深入的进度细节,例如导出第25项的第5项.我遇到的问题很明显,因为它正在运行与此同时,计数器不起作用,即总数会说出类似的结果
exporting 0 of 25
exporting 0 of 25
...
exporting 5 of 25
exporting 5 of 25
Run Code Online (Sandbox Code Playgroud)
任何人都可以指导如何在这样的并行循环中使行为工作:
int runningTotal = 0;
Parallel.ForEach(source, x =>
{
Repository.Commit(x);
runningTotal++;
progressReporter.ReportProgress(() =>
{
//Progress bar update
this.progressFile.Value++;
this.lblProgress.Text = String
.Format("Exporting Source {0} of {1}", runningTotal, source.Count)
});
});
Run Code Online (Sandbox Code Playgroud)
希望这表明我希望实现的目标.
谢谢
我需要一个并行算法(成本最优)来检查给定的n个数字序列是否被排序.
为什么删除链表中的节点的以下代码段不是线程安全的?
编辑:注意每个节点都有自己的锁
// ... lock acquisition here
// ... assumption found to be valid here
prev->next = p->next;
p->next = NULL;
p->deleted = 1;
Run Code Online (Sandbox Code Playgroud) 我正在尝试在CUDA中编写代码以查找给定数字集的最大值.
假设您有20个数字,并且内核在2个5个线程的块上运行.现在假设10个线程同时比较前10个值,并且线程2找到最大值,因此线程2正在更新全局存储器中的最大值变量.当线程2正在更新时,将使用旧值进行比较的剩余线程(1,3-10)会发生什么?
如果我使用atomicCAS()锁定全局变量,线程(1,3-10)将使用旧的最大值进行比较吗?我怎样才能克服这个问题?
CUDA编程指南指出了这一点
条件代码中允许__syncthreads(),但仅当条件在整个线程块中进行相同的求值时,否则代码执行可能会挂起或产生意外的副作用.
因此,如果我需要在一个块上使用条件分支同步线程,其中一些线程可能会或可能不会采用包含该__syncthreads()调用的分支,这是否意味着它不起作用?
我想象可能存在各种各样的情况,你可能需要这样做; 例如,如果您有二进制掩码并需要有条件地对像素应用某个操作.比如说,if (mask(x, y) != 0)然后执行包含的代码__syncthreads(),否则什么都不做.怎么办?
很多时候,当我看到一些多线程代码时,我会看到Thread.Sleep()代码中的语句.
我甚至遇到了崩溃,我试图弄清楚问题所在,所以大部分的多线程代码都被注释掉了,慢慢地把它带到最后一块,当我添加一个for语句时:
for ( int i = 0; i < 1000000; ++i )
++i;
Run Code Online (Sandbox Code Playgroud)
它并没有崩溃.所以现在我更换Thread.Sleep()它似乎工作.我不能轻易地重新发布它在这里发布,但是Thread.Sleep()对于多线程应用程序是必要的吗?
他们的目的是什么?如果不使用它会导致意想不到的结果吗?
编辑:顺便说一下,我正在使用BackgroundWorker并且只在那里实现我的东西,但不确定是什么原因造成的.虽然我使用的API是托管应用程序,其中应用程序不是多线程的.所以例如我认为我不能同时在几个线程上调用它的API函数.不确定,但那是我的猜测.