如何为并行任务实现协程

所以,我有这段代码

for (z in 0 until texture.extent.z) {
    println(z)
    for (y in 0 until texture.extent.y)
        for (x in 0 until texture.extent.x) {

            val v = Vec3(x, y, z) / texture.extent
            var n = when {
                FRACTAL -> FractalNoise().noise(v * noiseScale)
                else -> 20f * glm.perlin(v)
            }
            n -= glm.floor(n)

            data[x + y * texture.extent.x + z * texture.extent.x * texture.extent.y] = glm.floor(n * 255).b
        }
}

这在 jvm 上占用了超过 4m。cpp 中原始示例使用 OpenMp 来加速计算。我听说过协程,我希望在这种情况下我可以利用它们。

我首先尝试将整个fors包装到 a 中,runBlocking因为我确实希望在继续之前所有协程都已完成。

runBlocking {

    for (z in 0 until texture.extent.z) {
        println(z)
        for (y in 0 until texture.extent.y)
            for (x in 0 until texture.extent.x) {
                launch {
                    val v = Vec3(x, y, z) / texture.extent
                    var n = when {
                        FRACTAL -> FractalNoise().noise(v * noiseScale)
                        else -> 20f * glm.perlin(v)
                    }
                    n -= glm.floor(n)

                    data[x + y * texture.extent.x + z * texture.extent.x * texture.extent.y] = glm.floor(n * 255).b
                }
            }
    }
}

但这会引发不同的线程错误以及最终的 jvm 崩溃

[thread 27624 also had an error][thread 23784 also had an error]# A fatal error has been detected by the Java Runtime Environment:


#
[thread 27624 also had an error][thread 23784 also had an error]# A fatal error has been detected by the Java Runtime Environment:


#
#  [thread 14004 also had an error]EXCEPTION_ACCESS_VIOLATION
[thread 32652 also had an error] (0xc0000005)[thread 32616 also had an error]
 at pc=0x0000000002d2fd50
, pid=23452[thread 21264 also had an error], tid=0x0000000000007b68

#
# JRE version: Java(TM) SE Runtime Environment (8.0_144-b01) (build 1.8.0_144-b01)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.144-b01 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# J 1431 C2 java.util.concurrent.ForkJoinPool$WorkQueue.runTask(Ljava/util/concurrent/ForkJoinTask;)V (86 bytes) @ 0x0000000002d2fd50 [0x0000000002d2f100+0xc50]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\gBarbieri\IdeaProjects\Vulkan\hs_err_pid23452.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#

Process finished with exit code 1

我也尝试将所有的jobs收集到一个 arrayList 中,最后将join()它们收集起来,但没有成功..

协程可以用于这样的并行任务吗?如果是,我做错了什么?

马尔科·托波尔尼克

您应该考虑构建在 JDK 中的并行计算引擎,而不是协程:java.util.stream. 你在这里拥有的是一个令人尴尬的可并行化任务,一个完美的用例。

我会沿着这些路线使用一些东西:

IntStream.range(0, extent.x)
        .boxed()
        .parallel()
        .flatMap { x ->
            IntStream.range(0, extent.y).boxed().flatMap { y ->
                IntStream.range(0, extent.z).mapToObj { z ->
                    Vec(x, y, z)
                }
            }
        }
        .forEach { vec ->
            data[vecToArrayIndex(vec)] = computeValue(vec)
        }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Scala Fork Join Pool,如何为没有并行结构的多个任务实现

来自分类Dev

如何启动并行协程并返回结果

来自分类Dev

C ++,当每个工作线程必须执行几个不同的任务时,如何为任务实现线程池

来自分类Dev

如何并行运行多个阻塞IO协程

来自分类Dev

如何并行运行多个阻塞IO协程

来自分类Dev

如何为当前线程创建协程分派器?

来自分类Dev

如何在Julia中杀死任务/协程?

来自分类Dev

如何为定位服务实现onConnectionFailed()和onDisconnected()

来自分类Dev

如何为定位服务实现onConnectionFailed()和onDisconnected()

来自分类Dev

如何为设计时服务实现异步方法

来自分类Dev

协程的产量与任务的产量

来自分类Dev

调用并行协程并等待所有协程结束

来自分类Dev

如何使用Kotlin协程实现计时器

来自分类Dev

如何使用Ruby的Fibers实现并行任务?

来自分类Dev

如何并行运行多个Kotlin协程并等待它们完成后再继续

来自分类Dev

协程与自定义超时实现

来自分类Dev

如何模拟异步协程?

来自分类Dev

如何知道当Kotlin协程使用Task <T> API时任务是否失败?

来自分类Dev

如何在 asyncio3.7 中向主协程添加多个任务?

来自分类Dev

启动时如何为Windows服务实现临时管理员权限窗口

来自分类Dev

如何实现多线程并并行执行几个任务?

来自分类Dev

带有翻新,协程和挂起功能的并行请求

来自分类Dev

使用asyncio协程并行运行功能?

来自分类Dev

如何为ASMX服务实施HTTPS

来自分类Dev

使用 Kotlin 实现插件时,如何为 Gradle 扩展任务?

来自分类常见问题

Kotlin协程如何比RxKotlin更好?

来自分类Dev

如何制作可重入的Boost协程?

来自分类Dev

如何从函数对象创建本机协程?

来自分类Dev

如何等待协程结束

Related 相关文章

  1. 1

    Scala Fork Join Pool,如何为没有并行结构的多个任务实现

  2. 2

    如何启动并行协程并返回结果

  3. 3

    C ++,当每个工作线程必须执行几个不同的任务时,如何为任务实现线程池

  4. 4

    如何并行运行多个阻塞IO协程

  5. 5

    如何并行运行多个阻塞IO协程

  6. 6

    如何为当前线程创建协程分派器?

  7. 7

    如何在Julia中杀死任务/协程?

  8. 8

    如何为定位服务实现onConnectionFailed()和onDisconnected()

  9. 9

    如何为定位服务实现onConnectionFailed()和onDisconnected()

  10. 10

    如何为设计时服务实现异步方法

  11. 11

    协程的产量与任务的产量

  12. 12

    调用并行协程并等待所有协程结束

  13. 13

    如何使用Kotlin协程实现计时器

  14. 14

    如何使用Ruby的Fibers实现并行任务?

  15. 15

    如何并行运行多个Kotlin协程并等待它们完成后再继续

  16. 16

    协程与自定义超时实现

  17. 17

    如何模拟异步协程?

  18. 18

    如何知道当Kotlin协程使用Task <T> API时任务是否失败?

  19. 19

    如何在 asyncio3.7 中向主协程添加多个任务?

  20. 20

    启动时如何为Windows服务实现临时管理员权限窗口

  21. 21

    如何实现多线程并并行执行几个任务?

  22. 22

    带有翻新,协程和挂起功能的并行请求

  23. 23

    使用asyncio协程并行运行功能?

  24. 24

    如何为ASMX服务实施HTTPS

  25. 25

    使用 Kotlin 实现插件时,如何为 Gradle 扩展任务?

  26. 26

    Kotlin协程如何比RxKotlin更好?

  27. 27

    如何制作可重入的Boost协程?

  28. 28

    如何从函数对象创建本机协程?

  29. 29

    如何等待协程结束

热门标签

归档