332 std::vector<size_t> selFileObjectIds;
334 const uint32_t fftSizeX = maxVolumeIndex / 2;
335 const uint32_t fftSizeY = maxVolumeIndex;
353 starpu_data_handle_t resultVolumeHandle = {0};
354 starpu_data_handle_t resultWeightsHandle = {0};
356 ComputeStarPUResult result;
363 uint32_t dim =
static_cast<uint32_t
>(maxVolumeIndex + 1);
364 uint32_t dim3 =
align(dim * dim * dim, 4);
365 size_t volumeDataSize = dim3 *
sizeof(std::complex<float>);
366 size_t weightDataSize = dim3 *
sizeof(float);
367 CHECK_STARPU(starpu_malloc((
void **) &result.volumeData, volumeDataSize));
368 CHECK_STARPU(starpu_malloc((
void **) &result.weightsData, weightDataSize));
370 memset(result.volumeData, 0, volumeDataSize);
371 memset(result.weightsData, 0, weightDataSize);
373 starpu_vector_data_register(&resultVolumeHandle, STARPU_MAIN_RAM, (uintptr_t) result.volumeData, dim3,
sizeof(std::complex<float>));
374 starpu_vector_data_register(&resultWeightsHandle, STARPU_MAIN_RAM, (uintptr_t) result.weightsData, dim3,
sizeof(
float));
377 starpu_data_set_name(resultVolumeHandle,
"Result Volume Data");
378 starpu_data_set_name(resultWeightsHandle,
"Result Weights Data");
381 starpu_data_handle_t blobTableSquaredHandle = {0};
384 starpu_variable_data_register(&blobTableSquaredHandle, -1, 0, 1);
386 starpu_variable_data_register(&blobTableSquaredHandle, STARPU_MAIN_RAM,
389 starpu_data_set_name(blobTableSquaredHandle,
"Blob Table Squared");
391 const uint32_t totalImages =
static_cast<uint32_t
>(SF.
size());
392 const uint32_t maxBatches = batches.maxBatches();
394 std::vector<LoadProjectionArgs> loadProjectionArgs;
396 loadProjectionArgs.reserve(maxBatches);
400 starpu_data_handle_t fftScratchMemoryHandle = {0};
402 uint32_t fftResultX = paddedImgSize/2+1;
403 starpu_matrix_data_register(&fftScratchMemoryHandle, -1, 0, fftResultX , fftResultX, paddedImgSize,
sizeof(
float) * 2);
404 starpu_data_set_name(fftScratchMemoryHandle,
"Scratch for raw FFT");
407 while ((batch = batches.nextBatch()) != -1) {
410 const uint32_t currentBatchSize =
static_cast<uint32_t
>(batchEnd - batchStart);
412 starpu_data_handle_t amountLoadedHandle = {0};
413 starpu_variable_data_register(&amountLoadedHandle, -1, 0,
sizeof(
LoadedImagesBuffer));
414 starpu_data_set_name(amountLoadedHandle,
"Batch Meta Data");
416 starpu_data_handle_t paddedImagesDataHandle = {0};
417 starpu_vector_data_register(&paddedImagesDataHandle, -1, 0, currentBatchSize,
align(paddedImgSize * paddedImgSize *
sizeof(
float),
ALIGNMENT));
418 starpu_data_set_name(paddedImagesDataHandle,
"Batch Padded Image Data");
420 starpu_data_handle_t traverseSpacesHandle = {0};
422 starpu_data_set_name(traverseSpacesHandle,
"Batch Traverse Spaces");
426 const size_t argIndex = loadProjectionArgs.size();
430 batchStart, batchEnd,
435 maxVolumeIndex, maxVolumeIndex,
444 starpu_task *loadProjectionsTask = starpu_task_create();
445 loadProjectionsTask->name =
"LoadProjections";
447 loadProjectionsTask->cl_arg = (
void *) &loadProjectionArg;
448 loadProjectionsTask->cl_arg_size =
sizeof(loadProjectionArg);
449 loadProjectionsTask->cl_arg_free = 0;
450 loadProjectionsTask->handles[0] = amountLoadedHandle;
451 loadProjectionsTask->handles[1] = paddedImagesDataHandle;
452 loadProjectionsTask->handles[2] = traverseSpacesHandle;
459 starpu_data_handle_t fftHandle = {0};
460 starpu_vector_data_register(&fftHandle, -1, 0, currentBatchSize, fftSizeX * fftSizeY * 2 *
sizeof(
float));
461 starpu_data_set_name(fftHandle,
"Batch FFT Data");
464 starpu_task* paddedImageToFftTask = starpu_task_create();
465 paddedImageToFftTask->name =
"PaddedImageToFFT";
467 paddedImageToFftTask->handles[0] = paddedImagesDataHandle;
468 paddedImageToFftTask->handles[1] = fftHandle;
469 paddedImageToFftTask->handles[2] = fftScratchMemoryHandle;
470 paddedImageToFftTask->handles[3] = amountLoadedHandle;
471 paddedImageToFftTask->cl_arg = &imageToFftArg;
473 paddedImageToFftTask->cl_arg_free = 0;
478 starpu_data_unregister_submit(paddedImagesDataHandle);
481 starpu_task* reconstructFftTask = starpu_task_create();
482 reconstructFftTask->name =
"ReconstructFFT";
484 reconstructFftTask->handles[0] = fftHandle;
485 reconstructFftTask->handles[1] = traverseSpacesHandle;
486 reconstructFftTask->handles[2] = blobTableSquaredHandle;
487 reconstructFftTask->handles[3] = resultVolumeHandle;
488 reconstructFftTask->handles[4] = resultWeightsHandle;
489 reconstructFftTask->handles[5] = amountLoadedHandle;
490 reconstructFftTask->cl_arg = &reconstructFftArg;
492 reconstructFftTask->cl_arg_free = 0;
494 reconstructFftTask->callback_arg = &batches;
495 reconstructFftTask->callback_arg_free = 0;
502 starpu_data_unregister_submit(fftHandle);
503 starpu_data_unregister_submit(traverseSpacesHandle);
504 starpu_data_unregister_submit(amountLoadedHandle);
508 starpu_data_unregister_submit(blobTableSquaredHandle);
509 starpu_data_unregister_submit(fftScratchMemoryHandle);
519 starpu_data_unregister(resultVolumeHandle);
520 starpu_data_unregister(resultWeightsHandle);
double alpha
Smoothness parameter.
starpu_codelet reconstruct_fft
void padded_image_to_fft_cuda_initialize(uint32_t paddedImageSize)
starpu_codelet padded_image_to_fft
void reconstruct_cuda_initialize_constants(int maxVolIndexX, int maxVolIndexYZ, float blobRadius, float blobAlpha, float iDeltaSqrt, float iw0, float oneOverBessiOrderAlpha)
struct ProgRecFourierStarPU::ComputeConstants computeConstants
std::vector< Matrix2D< double > > R_symmetries
virtual void batchCompleted()=0
starpu_codelet redux_sum_volume
starpu_codelet redux_sum_weights
void padded_image_to_fft_cuda_deinitialize()
starpu_codelet redux_init_volume
#define CHECK_STARPU(operationWithReturnCode)
starpu_codelet redux_init_weights
T align(T number, uint32_t alignment)
const int DEBUG_SYNCHRONOUS_TASKS
int order
Derivation order and Bessel function order.
starpu_codelet load_projections
float blobTableSqrt[BLOB_TABLE_SIZE_SQRT]
struct ProgRecFourierStarPU::Params params
double radius
Spatial radius in Universal System units.