     for (int i = 0; i < FLAGS_repetitions; ++i)
     {
         if (i % 2 == 0)
-            maps::multi::Invoke(sched, GameOfLifeTickMMAPS<T, BW, BH, IPX, IPY>, grid_dims, block_dims,
-                                maps::multi::Window2D<T, BW, BH, 1, maps::WB_WRAP, IPX, IPY>(A), 
-                                maps::multi::StructuredInjectiveMatrixO<T, IPX, IPY>(B));
+            maps::multi::Invoke(sched, GameOfLifeTickMMAPS<BW, BH, IPX, IPY>, grid_dims, block_dims,
+                                maps::multi::Window2D<unsigned char, BW, BH, 1, maps::WB_WRAP, IPX, IPY>(A), 
+                                maps::multi::StructuredInjectiveMatrixO<unsigned char, IPX, IPY>(B));
         else
-            maps::multi::Invoke(sched, GameOfLifeTickMMAPS<T, BW, BH, IPX, IPY>, grid_dims, block_dims,
-                                maps::multi::Window2D<T, BW, BH, 1, maps::WB_WRAP, IPX, IPY>(B), 
-                                maps::multi::StructuredInjectiveMatrixO<T, IPX, IPY>(A));
+            maps::multi::Invoke(sched, GameOfLifeTickMMAPS<BW, BH, IPX, IPY>, grid_dims, block_dims,
+                                maps::multi::Window2D<unsigned char, BW, BH, 1, maps::WB_WRAP, IPX, IPY>(B), 
+                                maps::multi::StructuredInjectiveMatrixO<unsigned char, IPX, IPY>(A));
     }
 
     sched.WaitAll();

    outFrame.commit();
}

template<typename T>
void SavePGMFile(const T *data, size_t width, size_t height, const char *filename)
{
    if (!FLAGS_save_images)
        return;

	FILE *fp = fopen(filename, "wb");
	if (fp)
	{
		fprintf(fp, "P5\n%lu %lu\n1\n", width, height);
		fwrite(data, sizeof(unsigned char), width * height, fp);
		fclose(fp);
	}
}


bool GoLCPURegression(const unsigned char *otherResult)
{
    if (!FLAGS_regression)
        return true;

    unsigned char *dev_inImage = NULL, *dev_outImage = NULL;

    size_t width = FLAGS_width, height = FLAGS_height, inStride = 0, outStride = 0;

