Skip to content
Back to formatted view

Raw Message

Message-ID: <ebce23ec19154286889dd1222c434b72@chu-rouen.fr>
Date: 2021-08-27T11:44:56Z
From: GILLIBERT, Andre
Subject: R_CheckUserInterrupt

Dear R developers,


R makes some functions interruptible, thanks to a call to R_CheckUserInterrupt. Simple arithmetic operations can be interrupted avoiding freezes when using huge arrays (e.g. length > 1 billion).

But many operations, such as matrix multiplication, are not interruptible. I estimated that a multiplication of two 10000?10000 square matrices would freeze R for at least 7 days on my computer, unless I kill the process.


I found an old commit that deleted the calls to R_CheckUserInterrupt in many basic operations (https://github.com/wch/r-source/commit/b99cd362a65012335a853d954cbeb1c782e6ae37)


Why were they deleted ?


First hypothesis : this slowed down the code too much, because it was done suboptimally, with an integer division (high latency CPU operation) at each iteration.

Second hypothesis : this introduced bugs, such as memory leaks, in code that did not handle interruptions gracefully.


If the first hypothesis is correct, I can write much better code, with almost zero penalty, using R_ITERATE_CHECK (in R_ext/Itermacros.h) and a new macro I wrote: ITERATE_BY_REGION_CHECK.


That would make more operations interruptible and would even provide performances improvements in loops that were not optimized for ALTREPs.


Are you interested in patches?



PS: the slow integer division is actually not very slow with recent GCC versions, because this compiler is smart enough to replace it by a multiplication and a shift because the divisor is known at compile time. Older compilers may not be that smart.


--

Sincerely

Andr? GILLIBERT

	[[alternative HTML version deleted]]