Лучше всего я понимаю требования, хеш выполняет желаемую функциональность. Повторно интерпретируйте входные данные с плавающей точкой как целое число, примените хеш-функцию, чтобы получить целое число, приблизительно равномерно распределенное в [0,2 ^ 32), затем умножьте это целое число на 2 ^ -32, чтобы преобразовать полученное целое число обратно в число с плавающей точкой примерно равномерно распределяется в [0,1]. Одна подходящая хеш-функция, которая не требует умножения, - это микс Боба Дженкина (), который можно найти здесь: http://www.burtleburtle.net/bob/hash/doobs.html.
Чтобы заново интерпретировать биты с плавающей точкой как целое число, и наоборот, в CUDA есть два варианта. Используйте встроенные функции или приведите реинтерпретацию в стиле C ++:
float f;
int i;
i = __float_as_int(f);
f = __int_as_float(i);
i = reinterpret_cast<int&>(f);
f = reinterpret_cast<float&>(i);
Таким образом, как отдельная функция, весь процесс может выглядеть примерно так:
/* transform float in [0,1] into a different float in [0,1] */
float scramble_float (float f)
{
unsigned int magic1 = 0x96f563ae; /* number of your choice */
unsigned int magic2 = 0xb93c7563; /* number of your choice */
unsigned int j;
j = reinterpret_cast<unsigned int &>(f);
mix (magic1, magic2, j);
return 2.3283064365386963e-10f * j;
}