     P2PEngine mechanism;
 };
 
+template <typename T>
+struct square_matrix {
+	using size_type = typename std::vector<T>::size_type;
+	std::vector<T> elements;
+	size_type leg;
+
+	static square_matrix make(std::size_t leg)
+	{
+		square_matrix<T> result;
+		result.elements.resize(leg*leg);
+		result.leg = leg;
+		return result;
+	}
+
+	T& operator()(size_type x, size_type y) { return elements.at(x * leg + y); }
+	T operator()(size_type x, size_type y) const { return elements.at(x * leg + y); }
+
+};
+
+// template square_matrix<double>;
+
+void print(const square_matrix<double> &bandwidthMatrix, const char* axis_cross_label);
 
 constexpr const unsigned long long default_timeout_clocks = 10000000ull;
 

    }
}

void outputBandwidthMatrix(P2PEngine mechanism, int numGPUs, bool test_p2p, P2PDataTransfer p2p_method)
{
    int numElems = 10000000;
    int repeat = 5;

        stop.push_back(device.create_event());
    }

    auto num_gpus = cuda::devices().size();
    auto bandwidthMatrix = square_matrix<double>::make(num_gpus);

    for (int i = 0; i < num_gpus; i++) {
        auto device = cuda::device::get(i);

        for (int j = 0; j < num_gpus; j++) {
            auto peer = cuda::device::get(j);
            bool p2p_access_possible { false };
            if (test_p2p) {
