@@ -31,7 +31,7 @@ along with RandomX OpenCL. If not, see <http://www.gnu.org/licenses/>.
3131
3232using namespace std ::chrono;
3333
34- bool test_mining (uint32_t platform_id, uint32_t device_id, size_t intensity, uint32_t start_nonce, uint32_t workers_per_hash, uint32_t bfactor, uint32_t high_precision, bool portable, bool validate)
34+ bool test_mining (uint32_t platform_id, uint32_t device_id, size_t intensity, uint32_t start_nonce, uint32_t workers_per_hash, uint32_t bfactor, uint32_t high_precision, bool portable, bool dataset_host_allocated, bool validate)
3535{
3636 std::cout << " Initializing GPU #" << device_id << " on OpenCL platform #" << platform_id << std::endl << std::endl;
3737
@@ -104,14 +104,18 @@ bool test_mining(uint32_t platform_id, uint32_t device_id, size_t intensity, uin
104104 intensity -= (intensity & 63 );
105105
106106 const size_t dataset_size = randomx_dataset_item_count () * RANDOMX_DATASET_ITEM_SIZE;
107- ALLOCATE_DEVICE_MEMORY (dataset_gpu, ctx, dataset_size);
108-
109- std::cout << " Allocated " << (dataset_size / 1048576.0 ) << " MB dataset" << std::endl;
107+ cl_int err;
108+ cl_mem dataset_gpu = nullptr ;
109+ if (!dataset_host_allocated)
110+ {
111+ dataset_gpu = clCreateBuffer (ctx.context , CL_MEM_READ_ONLY, dataset_size, nullptr , &err);
112+ CL_CHECK_RESULT (clCreateBuffer);
113+ std::cout << " Allocated " << (dataset_size / 1048576.0 ) << " MB dataset on GPU" << std::endl;
114+ }
110115 std::cout << " Initializing dataset..." ;
111116
112117 randomx_dataset *myDataset;
113118 bool large_pages_available = true ;
114- cl_int err;
115119 {
116120 auto t1 = high_resolution_clock::now ();
117121
@@ -162,11 +166,21 @@ bool test_mining(uint32_t platform_id, uint32_t device_id, size_t intensity, uin
162166 }
163167 }
164168
165- CL_CHECKED_CALL (clEnqueueWriteBuffer, ctx.queue , dataset_gpu, CL_TRUE, 0 , dataset_size, randomx_get_dataset_memory (myDataset), 0 , nullptr , nullptr );
169+ if (!dataset_host_allocated)
170+ {
171+ CL_CHECKED_CALL (clEnqueueWriteBuffer, ctx.queue , dataset_gpu, CL_TRUE, 0 , dataset_size, randomx_get_dataset_memory (myDataset), 0 , nullptr , nullptr );
172+ }
166173
167174 std::cout << " done in " << (duration_cast<nanoseconds>(high_resolution_clock::now () - t1).count () / 1e9 ) << " seconds" << std::endl;
168175 }
169176
177+ if (dataset_host_allocated)
178+ {
179+ dataset_gpu = clCreateBuffer (ctx.context , CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, dataset_size, randomx_get_dataset_memory (myDataset), &err);
180+ CL_CHECK_RESULT (clCreateBuffer);
181+ std::cout << " Using host-allocated " << (dataset_size / 1048576.0 ) << " MB dataset" << std::endl;
182+ }
183+
170184 ALLOCATE_DEVICE_MEMORY (scratchpads_gpu, ctx, intensity * (SCRATCHPAD_SIZE + 64 ));
171185 std::cout << " Allocated " << intensity << " scratchpads\n " << std::endl;
172186
0 commit comments