     cudaFree(E_v_ptr);
     cudaFree(outputs_ptr);
 
+    std::chrono::steady_clock::time_point free_end = std::chrono::steady_clock::now();
+
     // Compute aggregate outputs based upon individual edge outputs
     EDGE_OUTPUT aggregates = {0};
 

    dim3 dimBlock(blocksize, 1);
    dim3 dimGrid(gridsize, 1);

    // Execute CUDA kernel
    // TODO: Add timing to kernel execution and count aggregation below
    graphlets<<<dimGrid, dimBlock>>>(V_ptr, V_num, E_ptr, E_num, E_u_ptr, E_v_ptr, outputs_ptr);

    // Copy output data from GPU memory back into main memory
    cudaMemcpy(outputs.data(), outputs_ptr, outputs_size, cudaMemcpyDeviceToHost);

    // Free memory in GPU
    cudaFree(V_ptr);

    int E_size = E_num * sizeof(int);
    int outputs_size = E_num * sizeof(EDGE_OUTPUT);

    std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();

    // Malloc GPU memory and store location in pointers
    cudaMalloc((void**)&V_ptr, V_size);
    cudaMalloc((void**)&E_ptr, E_size);
