- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
场景是这样的:在一个Parallel.For里面一个数组被用在一个非parallel for中。数组的所有元素都被覆盖,因此在技术上没有必要分配和初始化它(据我从 C# 教程中推断,这总是在构造时发生):
float[] result = new float[16384];
System.Threading.Tasks.Parallel.For(0,16384,x =>
{
int[] histogram = new int[32768]; // allocation and initialization with all 0's, no?
for (int i = 0; i < histogram.Length; i++)
{
histogram[i] = some_func(); // each element in histogram[] is written anew
}
result[x] = do_something_with(histogram);
});
顺序代码中的解决方案很简单:将数组拉到外部 for 循环的前面:
float[] result = new float[16384];
int[] histogram = new int[32768]; // allocation and initialization with
for(x = 0; x < 16384; x++)
{
for (int i = 0; i < histogram.Length; i++)
{
histogram[i] = some_func();
}
restult[x] = do_something_with(histogram);
}
现在在外循环中既没有分配也没有徒劳的 0-ing 发生。然而,在并行版本中,这肯定是一个糟糕的举动,要么并行进程正在破坏彼此的直方图结果,要么 C# 足够聪明以锁定 histogram
从而关闭任何并行性。分配一个 histogram[16384,32768]
同样是一种浪费。我现在正在尝试的是
public static ParallelLoopResult For<TLocal>(
int fromInclusive,
int toExclusive,
Func<TLocal> localInit,
Func<int, ParallelLoopState, TLocal, TLocal> body,
Action<TLocal> localFinally
)
库构造(函数?),但由于这是我第一次尝试使用 C# 进行并行编程,所以我充满了疑问。以下是顺序案例的正确翻译吗?
float[] result = new float[16384];
System.Threading.Tasks.Parallel.For<short[]>(0, 16384,
() => new short[32768],
(x, loopState, histogram) =>
{
for (int i = 0; i < histogram.Length; i++)
{
histogram[i] = some_func();
}
result[x] = do_something_with(histogram);
return histogram;
}, (histogram) => { });
最佳答案
我不完全确定您的要求,但让我们看看起点:
public void Original()
{
float[] result = new float[16384];
System.Threading.Tasks.Parallel.For(0, 16384, x =>
{
int[] histogram = new int[32768]; // allocation and initialization with all 0's, no?
for (int i = 0; i < histogram.Length; i++)
{
histogram[i] = some_func(); // each element in histogram[] is written anew
}
result[x] = do_something_with(histogram);
});
}
内部循环生成一个 histogram
而外循环需要一个 histogram
并使用它在 Results
中生成单个值.
一种易于操作的解决方案是执行此处理 TPL-Dataflow ,这是 TPL 之上的抽象。要进行设置,我们需要一些 DTO 来通过数据流管道。
public class HistogramWithIndex
{
public HistogramWithIndex(IEnumerable<int> histogram, int index)
{
Histogram = histogram;
Index = index;
}
public IEnumerable<int> Histogram { get; }
public int Index { get; }
}
public class IndexWithHistogramSize
{
public IndexWithHistogramSize(int index, int histogramSize)
{
Index = index;
HistogramSize = histogramSize;
}
public int Index { get; }
public int HistogramSize { get; }
}
这些类代表处于不同处理阶段的数据。现在让我们看看管道。
public async Task Dataflow()
{
//Build our pipeline
var options = new ExecutionDataflowBlockOptions()
{
MaxDegreeOfParallelism = Environment.ProcessorCount,
//This is default but I want to point it out
EnsureOrdered = true
};
var buildHistorgramBlock = new TransformBlock<IndexWithHistogramSize, HistogramWithIndex>(inputData =>
{
var histogram = Enumerable.Range(0, inputData.HistogramSize).Select(_ => some_func());
return new HistogramWithIndex(histogram, inputData.Index);
}, options);
var doSomethingBlock = new TransformBlock<HistogramWithIndex, int>(x => do_something_with(x.Histogram.ToArray()), options);
var resultBlock1 = new ActionBlock<int>(x => Results1.Add(x), options);
//var resultBlock2 = new ActionBlock<int>(x => //insert into list with index, options);
//link the blocks
buildHistorgramBlock.LinkTo(doSomethingBlock, new DataflowLinkOptions() { PropagateCompletion = true });
doSomethingBlock.LinkTo(resultBlock1, new DataflowLinkOptions() { PropagateCompletion = true });
//Post data
var histogramSize = 32768;
foreach (var index in Enumerable.Range(0, 16384))
{
await buildHistorgramBlock.SendAsync(new IndexWithHistogramSize(index, histogramSize));
}
buildHistorgramBlock.Complete();
await resultBlock1.Completion;
}
由两个 TransformBLocks
组成的 block 和 ActionBlock
形成一个链接的管道。这样做的好处是,可以很容易地更改并行度、每个 block 的有限容量以引入背压等等。
重要提示:TransformBlocks
,如果使用并行性,即 MDOP > 1,那么他们将按照收到的顺序输出他们的项目。这意味着如果他们按顺序进来,他们就会按顺序离开。您还可以使用 block 选项关闭排序 Ensure Ordering
.如果您希望您的项目在没有/有特定排序的特定索引中,这就会发挥作用。
这可能看起来有点矫枉过正,可能适合您的项目。但我发现这非常灵活且易于维护。尤其是当您开始向处理链中添加步骤时,添加一个 block 比将另一个 for 循环环绕在所有内容上要干净得多。
这是 c&p 的其余样板代码
private ConcurrentBag<int> Results1 = new ConcurrentBag<int>();
private int some_func() => 1;
private int do_something_with(int[] i) => i.First();
关于C# Parallel.For 和非初始化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51520017/
我是 Spring 新手,这就是我想要做的事情: 我正在使用一个基于 Maven 的库,它有自己的 Spring 上下文和 Autowiring 字段。 它的bean配置文件是src/test/res
我在我的测试脚本中有以下列表初始化: newSequenceCore=["ls", "ns", "*", "cm", "*", "ov", "ov", "ov", "ov", "kd"] (代表要在控
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Class construction with initial values 当我查看 http://en.
我得到了成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非常量静态成员的类内初始化”。这是主类: #include #include "Tree.h" using n
我有如下所示的a.h class A { public: void doSomething()=0; }; 然后我有如下所示的b.h #include "a.h" class b: publi
我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 DataSnapshot 来手动解析它进入二
我使用 JQuery 一段时间了,我总是使用以下代码来初始化我的 javascript: $(document).ready( function() { // Initalisation logic
这里是 Objective-C 菜鸟。 为什么会这样: NSString *myString = [NSString alloc]; [myString initWithFormat:@"%f", s
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我对这一切都很陌生,并且无法将其安装到我的后端代码中。它去哪里?在我的页脚下面有我所有的 JS? 比如,这是什么意思: Popup initialization code should be exec
这可能是一个简单的问题,但是嘿,我是初学者。 所以我创建了一个程序来计算一些东西,它目前正在控制台中运行。我决定向其中添加一个用户界面,因此我使用 NetBeans IDE 中的内置功能创建了一个 J
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
据我所知, dependentObservable 在声明时会进行计算。但如果某些值尚不存在怎么办? 例如: var viewModel ={}; var dependentObservable1 =
我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。 class Gear attr_reader :chainring, :cog, :wheel de
我按照 polymer 教程的说明进行操作: https://www.polymer-project.org/3.0/start/install-3-0 (我跳过了可选部分) 但是,在我执行命令“po
很抱歉问到一个非常新手的Kotlin问题,但是我正在努力理解与构造函数和初始化有关的一些东西。 我有这个类和构造函数: class TestCaseBuilder constructor(
假设我们有一个包含 30 列和 30 行的网格。 生命游戏规则简而言之: 一个小区有八个相邻小区 当一个细胞拥有三个存活的相邻细胞时,该细胞就会存活 如果一个细胞恰好有两个或三个活的相邻细胞,那么它就
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我是一名优秀的程序员,十分优秀!