Personal tools

Talk:Numeric Haskell: A Repa Tutorial

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(New page: ---- '''Things I've Learned So Far''' If you specify a slice as such: (Z :. All :. 2), for example, you will get many pages of type incantation errors. In order to be a true wizard you m...)
 
(Moved stub sections from the tutorial page)
(3 intermediate revisions by one user not shown)
Line 1: Line 1:
  +
----
  +
  +
The tutorial contained some stub sections that were empty. I am moving this stub sections here to keep the tutorial page clean. These were originally placed after section 10 (Optimising Repa programs):
  +
  +
= Advanced techniques =
  +
  +
== Repa's parallel programming model ==
  +
  +
''Discussion about the gang threads and hooks to help''
  +
  +
== Programming with stencils ==
  +
  +
''Discuss the stencil types model''
  +
  +
--[[User:Killy9999|killy9999]] 09:16, 11 October 2012 (UTC)
   
 
----
 
----
Line 10: Line 25:
   
 
--[[User:Danharaj|Danharaj]] 00:51, 24 April 2011 (UTC)
 
--[[User:Danharaj|Danharaj]] 00:51, 24 April 2011 (UTC)
  +
  +
I have a bunch of simulation code that, every frame of simulation:
  +
  +
*Creates a few intermediate arrays.
  +
*Creates a list of intermediate arrays then folds them immediately
  +
*Adds and multiplies a few intermediate arrays with (*^) and (+^)
  +
  +
The thing is, unless I force at every intermediate step, the performance is so abysmal that the application loses responsiveness. With the forcing, it runs fast enough (need to optimize the code to make it run faster), but then...
  +
  +
I get this gem of a runtime warning (reported every frame)... sometimes!
  +
  +
Data.Array.Repa: Performing nested parallel computation sequentially.
  +
You've probably called the 'force' function while another instance was
  +
already running. This can happen if the second version was suspended due
  +
to lazy evaluation. Use 'deepSeqArray' to ensure that each array is fully
  +
evaluated before you 'force' the next one.
  +
  +
--[[User:Danharaj|Danharaj]] 16:48, 24 April 2011 (UTC)
  +
  +
The solution is to use deepSeqArray at each intermediate step, as the warning suggests. It works. Forcing arrays is idiomatic of Repa I think. You use it to specify sharing. force is lazy, however, so you have to deepSeqArray in order to get everything working nicely.
  +
  +
--[[User:Danharaj|Danharaj]] 18:47, 24 April 2011 (UTC)
 
----
 
----

Revision as of 09:16, 11 October 2012


The tutorial contained some stub sections that were empty. I am moving this stub sections here to keep the tutorial page clean. These were originally placed after section 10 (Optimising Repa programs):

1 Advanced techniques

1.1 Repa's parallel programming model

Discussion about the gang threads and hooks to help

1.2 Programming with stencils

Discuss the stencil types model

--killy9999 09:16, 11 October 2012 (UTC)


Things I've Learned So Far

If you specify a slice as such: (Z :. All :. 2), for example, you will get many pages of type incantation errors. In order to be a true wizard you must touch the 2 with a salve of type annotation as so: (Z :. All :. (2 :: Int)). This will satisfy the type demons that compile your code.

The reason is that GHC assumes literals like 2 are of type Integer, and Repa demands Ints.

I'll post more "oopsies" as I come across them.

--Danharaj 00:51, 24 April 2011 (UTC)

I have a bunch of simulation code that, every frame of simulation:

  • Creates a few intermediate arrays.
  • Creates a list of intermediate arrays then folds them immediately
  • Adds and multiplies a few intermediate arrays with (*^) and (+^)

The thing is, unless I force at every intermediate step, the performance is so abysmal that the application loses responsiveness. With the forcing, it runs fast enough (need to optimize the code to make it run faster), but then...

I get this gem of a runtime warning (reported every frame)... sometimes!

Data.Array.Repa: Performing nested parallel computation sequentially.

 You've probably called the 'force' function while another instance was
 already running. This can happen if the second version was suspended due
 to lazy evaluation. Use 'deepSeqArray' to ensure that each array is fully
 evaluated before you 'force' the next one.

--Danharaj 16:48, 24 April 2011 (UTC)

The solution is to use deepSeqArray at each intermediate step, as the warning suggests. It works. Forcing arrays is idiomatic of Repa I think. You use it to specify sharing. force is lazy, however, so you have to deepSeqArray in order to get everything working nicely.

--Danharaj 18:47, 24 April 2011 (UTC)