From: Skybuck Flying on
Maybe this is a good solution, crc16:

http://en.wikipedia.org/wiki/Cyclic_redundancy_check

(math group included too, maybe it will get through ;))

Bye,
Skybuck.

"Skybuck Flying" <IntoTheFuture(a)hotmail.com> wrote in message
news:6f76a$4b745dac$d53371df$29602(a)cache4.tilbu1.nb.home.nl...
> Hello,
>
> Soon I will attempt some gpgpu development/shader development... I have
> already done some tests and so forth the gpu and it's memory seem to be
> working just fine... (and fast ;) :)) No bit errors so far.
>
> However the thought of bit errors creeping into it is indeed a bit
> scary... The hardware is older from 2006: nvidia 7900 gtx with 512 MB of
> RAM. (OpenGL will be used for it's development and cg shaders).
>
> It seems this gpu works with 4 floating point fields per register. Either
> 16 bit or 32 bit. Maybe it's always 32 bit ? I am not sure... probably not
> because 16 bit performance is twice as high.
>
> I plan on using: 3x16 bits so that needs a "vector" register with 4x16
> bits.
>
> This means only 48 bits are used for example the .x, .y, .z and this
> leaves the .w to be used for something else.
>
> For me it could be interesting to make two modes of operations for the
> final product:
>
> First mode which uses 3x16 bits in registers and memory.
> Second mode which uses 4x16 bits in registers and memory.
>
> This would make the second mode slightly less memory efficient.
>
> I have a feeling that the gpu is very fast and has plenty of processing
> power/instruction power.
>
> So I might get away with adding some extra "data integrity checks" to the
> .x, .y, .z components and store them in .w component.
>
> So the idea is basically to apply a 16 bit "data integrity check" to 48
> bits of data. Using Shader Model 3.0 instructions/CG language for now...
>
> I wonder what is a good data integrity checking algorithm to detect bit
> errors in this situation ?
>
> The data integrity algorithm should not use to many branches... hopefully
> just one branch to compare results ?! ;)
>
> It shouldn't use too many memory look ups... that would be bad for
> performance ?! ;)...
>
> The 3x16 bits could be unpacked into 6x8 bit quantities which are then
> stored in 32 bit floating point registers to do further calculations on...
>
> If the algorithm is in floating point format and limits itself to 8 bit to
> 16 bit precision than that should work just fine... algorithms can be done
> with integers... I can convert it to 16 bit floating points ;) I could
> even convert it to 64 bit floating point but that would require 64 bit
> software math and would slow things done so better not to do that...
>
> The following operations are definetly available for such an algorithm:
> 32 bit floating point addition, can be used as 8 bit or 16 bit integer
> addition, (max 24 bit)
> 32 bit floating point subtraction, can be used as 8 bit or 16 bit integer
> subtraction, (max 24 bit)
> 32 bit floating point multiplication, can be used as 8 bit or 16 bit
> integer multiplication, (max 24 bit)
> 32 bit floating point division, can be used as 8 bit or 16 bit integer
> division, (max 24 bit)
>
> and ofcourse special graphics instructions:
> dot operations
> interpolation operations. (But I have never used them and don't quite
> understand on the gpu at least but I am willing to learn ;) :))
>
> Some idea's in my head for now:
>
> 1. A simply weak "checksum" where everything is summed together... seems
> like a very bad algorithm, since bit flips might go undetected.
> 2. A crc32 ? But the algorithm I have requires a large table and thus
> memory lookups... doesn't seem to smart... and crc32 is like a large
> division ? maybe overkill for just 48 bits of data ?
> 3. I can vaguely remember something about parity ? Is that the same as a
> checksum or different ? I think that's different... parity counts the bits
> set and then stores that ? Doesn't seem so strong ?
> 4. I can vaguely remember an error correcting code which could correct 1
> bit error ? by using two parities or so ? one vertical, one horizontal ?
>
> So I ask you software programmers/developers and hardware designers and
> algorithm designers :) out there the following question:
>
> What kind of error detection algorithms, or maybe even error correction
> algorithms are out there that you think would be suited for this special
> situation ?
>
> Also maybe you can design something specially for this situation ?
>
> (The algorithm could later also be applied to slightly smaller bits like
> only 16 bits, or 32 bits, or maybe even just 8 bits, but stored in 16
> bits... that would be nice.)
>
> Bye,
> Skybuck.
>