mirror of
https://git.wownero.com/wownero/RandomWOW.git
synced 2024-08-15 00:23:14 +00:00
Remember cache input data (#133)
Make init_cache and set_cache no-ops if fed the same data as before
This commit is contained in:
parent
f1199a9fc6
commit
01648b3bd6
4 changed files with 20 additions and 5 deletions
|
@ -50,6 +50,7 @@ struct randomx_cache {
|
||||||
randomx::DatasetInitFunc* datasetInit;
|
randomx::DatasetInitFunc* datasetInit;
|
||||||
randomx::SuperscalarProgram programs[RANDOMX_CACHE_ACCESSES];
|
randomx::SuperscalarProgram programs[RANDOMX_CACHE_ACCESSES];
|
||||||
std::vector<uint64_t> reciprocalCache;
|
std::vector<uint64_t> reciprocalCache;
|
||||||
|
std::string cacheKey;
|
||||||
|
|
||||||
bool isInitialized() {
|
bool isInitialized() {
|
||||||
return programs[0].getSize() != 0;
|
return programs[0].getSize() != 0;
|
||||||
|
|
|
@ -93,7 +93,12 @@ extern "C" {
|
||||||
void randomx_init_cache(randomx_cache *cache, const void *key, size_t keySize) {
|
void randomx_init_cache(randomx_cache *cache, const void *key, size_t keySize) {
|
||||||
assert(cache != nullptr);
|
assert(cache != nullptr);
|
||||||
assert(keySize == 0 || key != nullptr);
|
assert(keySize == 0 || key != nullptr);
|
||||||
|
std::string cacheKey;
|
||||||
|
cacheKey.assign((const char *)key, keySize);
|
||||||
|
if (cache->cacheKey != cacheKey || !cache->isInitialized()) {
|
||||||
cache->initialize(cache, key, keySize);
|
cache->initialize(cache, key, keySize);
|
||||||
|
cache->cacheKey = cacheKey;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void randomx_release_cache(randomx_cache* cache) {
|
void randomx_release_cache(randomx_cache* cache) {
|
||||||
|
@ -274,8 +279,10 @@ extern "C" {
|
||||||
UNREACHABLE;
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cache != nullptr)
|
if(cache != nullptr) {
|
||||||
vm->setCache(cache);
|
vm->setCache(cache);
|
||||||
|
vm->cacheKey = cache->cacheKey;
|
||||||
|
}
|
||||||
|
|
||||||
if(dataset != nullptr)
|
if(dataset != nullptr)
|
||||||
vm->setDataset(dataset);
|
vm->setDataset(dataset);
|
||||||
|
@ -293,7 +300,10 @@ extern "C" {
|
||||||
void randomx_vm_set_cache(randomx_vm *machine, randomx_cache* cache) {
|
void randomx_vm_set_cache(randomx_vm *machine, randomx_cache* cache) {
|
||||||
assert(machine != nullptr);
|
assert(machine != nullptr);
|
||||||
assert(cache != nullptr && cache->isInitialized());
|
assert(cache != nullptr && cache->isInitialized());
|
||||||
|
if (machine->cacheKey != cache->cacheKey) {
|
||||||
machine->setCache(cache);
|
machine->setCache(cache);
|
||||||
|
machine->cacheKey = cache->cacheKey;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void randomx_vm_set_dataset(randomx_vm *machine, randomx_dataset *dataset) {
|
void randomx_vm_set_dataset(randomx_vm *machine, randomx_dataset *dataset) {
|
||||||
|
|
|
@ -71,6 +71,7 @@ RANDOMX_EXPORT randomx_cache *randomx_alloc_cache(randomx_flags flags);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the cache memory and SuperscalarHash using the provided key value.
|
* Initializes the cache memory and SuperscalarHash using the provided key value.
|
||||||
|
* Does nothing if called again with the same key value.
|
||||||
*
|
*
|
||||||
* @param cache is a pointer to a previously allocated randomx_cache structure. Must not be NULL.
|
* @param cache is a pointer to a previously allocated randomx_cache structure. Must not be NULL.
|
||||||
* @param key is a pointer to memory which contains the key value. Must not be NULL.
|
* @param key is a pointer to memory which contains the key value. Must not be NULL.
|
||||||
|
@ -162,7 +163,8 @@ RANDOMX_EXPORT randomx_vm *randomx_create_vm(randomx_flags flags, randomx_cache
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reinitializes a virtual machine with a new Cache. This function should be called anytime
|
* Reinitializes a virtual machine with a new Cache. This function should be called anytime
|
||||||
* the Cache is reinitialized with a new key.
|
* the Cache is reinitialized with a new key. Does nothing if called with a Cache containing
|
||||||
|
* the same key value as already set.
|
||||||
*
|
*
|
||||||
* @param machine is a pointer to a randomx_vm structure that was initialized
|
* @param machine is a pointer to a randomx_vm structure that was initialized
|
||||||
* without RANDOMX_FLAG_FULL_MEM. Must not be NULL.
|
* without RANDOMX_FLAG_FULL_MEM. Must not be NULL.
|
||||||
|
|
|
@ -65,6 +65,8 @@ protected:
|
||||||
randomx_dataset* datasetPtr;
|
randomx_dataset* datasetPtr;
|
||||||
};
|
};
|
||||||
uint64_t datasetOffset;
|
uint64_t datasetOffset;
|
||||||
|
public:
|
||||||
|
std::string cacheKey;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace randomx {
|
namespace randomx {
|
||||||
|
|
Loading…
Reference in a new issue