mratsim / weave

A state-of-the-art multithreading runtime: message-passing based, fast, scalable, ultra-low overhead
Other
532 stars 22 forks source link

a plea for an easier to understand error message #169

Open HJarausch opened 3 years ago

HJarausch commented 3 years ago

First, I have just tried the parallelForStaged example of the README.md file. the statement sync(Weave) fails to compile with

parallelForStagedSC.nim(16, 7) Error: type mismatch: got <typedesc[Weave]>
but expected one of: 
proc sync[T](fv: Flowvar[T]): T
  first type mismatch at position: 1
  required type for fv: Flowvar[sync.T]
  but expression 'Weave' is of type: typedesc[Weave]

expression: sync(Weave)

Then, I have introduced an awaitable: MyLoop statement, and I have replaced the failing sync(Weave) with sync(MyLoop) (note the missing discard here)

This gives a horrible error message

weave/cross_thread_com/scoped_barriers.nim(66, 12) Warning: Moving a shared resource (an atomic type). [User]
.................................................
/home/jarausch/Nim_My/Par/parallelForStaged.nim(17, 7) Error: type mismatch: got 'bool' for '
let res = addr(result)
type
  CapturedTy = (typeof(res))
discard
proc weaveParallelStagedAwaitableSection(
    weaveParallelStagedSectionClosureEnv_: ptr (typeof(res))) {.nimcall, gcsafe,
    inline.} =
  let res = weaveParallelStagedSectionClosureEnv_[]
  loadBalance(Weave)
  var localSum = 0
  let this`gensym6 = workerContext.worker.currentTask
  block:
    {.noSideEffect.}:
      const
        loc`gensym17 = (filename: "/home/jarausch/.nimble/pkgs/weave-#master/weave/instrumentation/contracts.nim",
          line: 86, column: 14)
        ploc`gensym17 = "/home/jarausch/.nimble/pkgs/weave-#master/weave/instrumentation/contracts.nim(86, 15)"
      {.line: (filename: "/home/jarausch/.nimble/pkgs/weave-#master/weave/instrumentation/contracts.nim",
               line: 86, column: 14).}:
        if not this`gensym6.isLoop:
          failedAssertImpl("/home/jarausch/.nimble/pkgs/weave-#master/weave/instrumentation/contracts.nim(86, 15) `\nthis`gensym6.isLoop` " &
              ("\n    Contract violated for transient condition at parallel_for_staged.nim:69\n        this`gensym6.isLoop\n    The following values are contrary to expectations:\n        " &
              $ $this`gensym6.isLoop &
              "  [Worker " &
              "N/A" &
              "]\n"))
    {.noSideEffect.}:
      const
        loc`gensym24 = (filename: "/home/jarausch/.nimble/pkgs/weave-#master/weave/instrumentation/contracts.nim",
          line: 86, column: 14)
        ploc`gensym24 = "/home/jarausch/.nimble/pkgs/weave-#master/weave/instrumentation/contracts.nim(86, 15)"
      {.line: (filename: "/home/jarausch/.nimble/pkgs/weave-#master/weave/instrumentation/contracts.nim",
               line: 86, column: 14).}:
        if not (this`gensym6.start == this`gensym6.cur):
          failedAssertImpl("/home/jarausch/.nimble/pkgs/weave-#master/weave/instrumentation/contracts.nim(86, 15) `\nthis`gensym6.start == this`gensym6.cur` " &
              ("\n    Contract violated for transient condition at parallel_for_staged.nim:70\n        this`gensym6.start == this`gensym6.cur\n    The following values are contrary to expectations:\n        " &
              $`&`(`&`(`$`($this`gensym6.start), " == "), `$`($this`gensym6.cur)) &
              "  [Worker " &
              "N/A" &
              "]\n"))
    var i = this`gensym6.start
    this`gensym6.cur += this`gensym6.stride
    while i < this`gensym6.stop:
      localSum += i
      echo [getThreadId(Weave), " -> ", i]
      i += this`gensym6.stride
      this`gensym6.cur += this`gensym6.stride
      loadBalance(Weave)
  echo ["Thread ", getThreadId(Weave), ": localsum = ", localSum]
  atomicInc(res[], localSum)
  block:
    while not isNil(this`gensym6.futures):
      let fvNode`gensym6 = cast[FlowvarNode](this`gensym6.futures)
      this`gensym6.futures = cast[pointer](fvNode`gensym6.next)
      let dummyFV`gensym6 = cast[Flowvar[bool]](fvNode`gensym6.chan)
      let isLastIter`gensym6 = sync(dummyFV`gensym6)
      {.noSideEffect.}:
        const
          loc`gensym69 = (filename: "/home/jarausch/.nimble/pkgs/weave-#master/weave/instrumentation/contracts.nim",
            line: 86, column: 14)
          ploc`gensym69 = "/home/jarausch/.nimble/pkgs/weave-#master/weave/instrumentation/contracts.nim(86, 15)"
        {.line: (filename: "/home/jarausch/.nimble/pkgs/weave-#master/weave/instrumentation/contracts.nim",
                 line: 86, column: 14).}:
          if not not isLastIter`gensym6:
            failedAssertImpl("/home/jarausch/.nimble/pkgs/weave-#master/weave/instrumentation/contracts.nim(86, 15) `\nnot isLastIter`gensym6` \n    Contract violated for transient condition at parallel_for_staged.nim:96\n        not isLastIter`gensym6\n    The following values are contrary to expectations:\n        not isLastIter`gensym6  [Worker N/A]\n")
      recycleFVN(fvNode`gensym6)

proc weaveTask_ParallelStagedAwaitable_(param`gensym2: pointer) {.nimcall,
    gcsafe.} =
  let this`gensym2 = workerContext.worker.currentTask
  const
    loc`gensym74 = (filename: "/home/jarausch/.nimble/pkgs/weave-#master/weave/parallel_for_staged.nim",
      line: 191, column: 8)
    ploc`gensym74 = "/home/jarausch/.nimble/pkgs/weave-#master/weave/parallel_for_staged.nim(191, 9)"
  {.line: (filename: "/home/jarausch/.nimble/pkgs/weave-#master/weave/parallel_for_staged.nim",
           line: 191, column: 8).}:
    if not not isNil(this`gensym2.parent):
      failedAssertImpl("/home/jarausch/.nimble/pkgs/weave-#master/weave/parallel_for_staged.nim(191, 9) `not isRootTask(this`gensym2)` ")
  let lastLoopIter`gensym2 = cast[ptr Flowvar[bool]](param`gensym2)
  let offset`gensym2 = cast[pointer](cast[ByteAddress](param`gensym2) +% 8)
  let weaveParallelStagedSectionClosureEnv_ = cast[ptr CapturedTy](offset`gensym2)
  weaveParallelStagedAwaitableSection(weaveParallelStagedSectionClosureEnv_)
  readyWith(lastLoopIter`gensym2[], this`gensym2.isInitialIter)

var MyLoop: Flowvar[bool]
const
  loc`gensym86 = (filename: "/home/jarausch/.nimble/pkgs/weave-#master/weave/parallel_macros.nim",
    line: 292, column: 6)
  ploc`gensym86 = "/home/jarausch/.nimble/pkgs/weave-#master/weave/parallel_macros.nim(292, 7)"
{.line: (filename: "/home/jarausch/.nimble/pkgs/weave-#master/weave/parallel_macros.nim",
         line: 292, column: 6).}:
  if not not isSpawned(MyLoop):
    failedAssertImpl("/home/jarausch/.nimble/pkgs/weave-#master/weave/parallel_macros.nim(292, 7) `not isSpawned(MyLoop)` Trying to override an allocated Flowvar.")
MyLoop = newFlowVar(globalCtx.mempools[workerContext.worker.ID], T)
if (
  when nimvm:
    not (`+`(n, 1) - 0 == 0)
  else:
    likelyProc:
      not (`+`(n, 1) - 0 == 0)
  ):
  block enq_deq_task`gensym3:
    let task = newTaskFromCache()
    task.parent = workerContext.worker.currentTask
    task.fn = weaveTask_ParallelStagedAwaitable_
    registerDescendant(workerContext.worker.currentScope)
    task.scopedBarrier = workerContext.worker.currentScope
    task.start = 0
    task.cur = 0
    task.stop = `+`(n, 1)
    task.stride = 1
    task.futureSize = uint8(1)
    task.hasFuture = true
    task.isLoop = true
    task.isInitialIter = true
    cast[ptr (Flowvar[bool], CapturedTy)](addr(task.data))[] = (MyLoop, res)
    schedule(task)
else:
  readyWith(MyLoop, default(T))
sync(MyLoop)' but expected 'int'
mratsim commented 3 years ago

Can you give me the full code you tried?

HJarausch commented 3 years ago

It's just your example parallelForStaged.nim.txt

mratsim commented 3 years ago

Unfortunately I have no way to hide these kinds of errors, even if I try to wrap the code in a proc, the proc body is expanded in the error.