Преглед изворни кода

Remember cache input data (#133)

Make init_cache and set_cache no-ops if fed the same data as before
hyc пре 7 година
родитељ
комит
01648b3bd6
4 измењених фајлова са 20 додато и 5 уклоњено
  1. 1 0
      src/dataset.hpp
  2. 13 3
      src/randomx.cpp
  3. 3 1
      src/randomx.h
  4. 3 1
      src/virtual_machine.hpp

+ 1 - 0
src/dataset.hpp

@@ -50,6 +50,7 @@ struct randomx_cache {
 	randomx::DatasetInitFunc* datasetInit;
 	randomx::SuperscalarProgram programs[RANDOMX_CACHE_ACCESSES];
 	std::vector<uint64_t> reciprocalCache;
+	std::string cacheKey;
 
 	bool isInitialized() {
 		return programs[0].getSize() != 0;

+ 13 - 3
src/randomx.cpp

@@ -93,7 +93,12 @@ extern "C" {
 	void randomx_init_cache(randomx_cache *cache, const void *key, size_t keySize) {
 		assert(cache != nullptr);
 		assert(keySize == 0 || key != nullptr);
-		cache->initialize(cache, key, keySize);
+		std::string cacheKey;
+		cacheKey.assign((const char *)key, keySize);
+		if (cache->cacheKey != cacheKey || !cache->isInitialized()) {
+			cache->initialize(cache, key, keySize);
+			cache->cacheKey = cacheKey;
+		}
 	}
 
 	void randomx_release_cache(randomx_cache* cache) {
@@ -274,8 +279,10 @@ extern "C" {
 					UNREACHABLE;
 			}
 
-			if(cache != nullptr)
+			if(cache != nullptr) {
 				vm->setCache(cache);
+				vm->cacheKey = cache->cacheKey;
+			}
 
 			if(dataset != nullptr)
 				vm->setDataset(dataset);
@@ -293,7 +300,10 @@ extern "C" {
 	void randomx_vm_set_cache(randomx_vm *machine, randomx_cache* cache) {
 		assert(machine != nullptr);
 		assert(cache != nullptr && cache->isInitialized());
-		machine->setCache(cache);
+		if (machine->cacheKey != cache->cacheKey) {
+			machine->setCache(cache);
+			machine->cacheKey = cache->cacheKey;
+		}
 	}
 
 	void randomx_vm_set_dataset(randomx_vm *machine, randomx_dataset *dataset) {

+ 3 - 1
src/randomx.h

@@ -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.
+ * 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 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
- * 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
  *        without RANDOMX_FLAG_FULL_MEM. Must not be NULL.

+ 3 - 1
src/virtual_machine.hpp

@@ -65,6 +65,8 @@ protected:
 		randomx_dataset* datasetPtr;
 	};
 	uint64_t datasetOffset;
+public:
+	std::string cacheKey;
 };
 
 namespace randomx {
@@ -80,4 +82,4 @@ namespace randomx {
 		void generateProgram(void* seed);
 	};
 
-}
+}