{"version":"https:\/\/jsonfeed.org\/version\/1","title":"Playground Samples Feed","feed_url":"https:\/\/feeds.sycl.tech\/feed\/playground_samples\/feed.json","items":[{"id":"d3036ab876aabdaaf79c3b4adfed3157d8227dd4","title":"Hello World! (on device)","content_text":"#include <sycl\/sycl.hpp>\n\nclass hello_world;\n\nint main(int, char**) {\n    auto device_selector = sycl::default_selector_v;\n    \n    sycl::queue queue(device_selector);\n\n    std::cout << \"Running on: \"\n              << queue.get_device().get_info<sycl::info::device::name>()\n              << \"\\n\";\n    \n    queue.submit([&] (sycl::handler& cgh) {\n        auto os = sycl::stream{128, 128, cgh};\n        cgh.single_task<hello_world>([=]() { \n            os << \"Hello World! (on device)\\n\"; \n        });\n    });\n    \n    return 0;\n}","summary":"Learn the basics with classic Hello World! sample, run on device.","author":{"name":"Scott Straughan","url":"https:\/\/www.linkedin.com\/in\/scott-straughan-b83b25177","avatar":"https:\/\/feeds.sycl.tech\/static\/images\/contributors\/scott.webp","_links":["https:\/\/www.linkedin.com\/in\/scott-straughan-b83b25177"],"_position":"Software Engineer","_affiliation":"Codeplay Software","_id":"7878e7f00c1a2925c570632bad1f7c50799a6b8c","_date_published":"2024-01-31T11:11:59.629762","_summary":"Hello, I am Scott, the web service and design lead at Codeplay Software Ltd.","_username":"scott","_content_html":"<p>Hello, I am Scott, the web service and design lead at Codeplay Software Ltd.<\/p>","_contribution_counts":{"events":18,"projects":54,"news":45,"research_papers":32,"videos":29}},"_cached_response":"Hello World! (on device)","_tag":"hello-world-on-device"},{"id":"ce1722fc503f04053822be60af4b1e27deccf60a","title":"In Order Queue","content_text":"#include <iostream>\n#include <sycl\/sycl.hpp>\n\nclass kernel_a_1;\nclass kernel_b_1;\nclass kernel_c_1;\nclass kernel_d_1;\n\nint main(int, char**) {\n    constexpr size_t dataSize = 256;\n\n    float inA[dataSize], inB[dataSize], inC[dataSize], out[dataSize];\n    for (int i = 0; i < dataSize; ++i) {\n        inA[i] = static_cast<float>(i);\n        inB[i] = static_cast<float>(i);\n        inC[i] = static_cast<float>(i);\n        out[i] = 0.0f;\n    }\n\n    try {\n        auto queue = sycl::queue{sycl::default_selector_v,\n                    {sycl::property::queue::in_order{}}};\n\n        std::cout << \"Running on: \"\n              << queue.get_device().get_info<sycl::info::device::name>()\n              << \"\\n\";\n\n        auto bufInA = sycl::buffer{inA, sycl::range{dataSize}};\n        auto bufInB = sycl::buffer{inB, sycl::range{dataSize}};\n        auto bufInC = sycl::buffer{inC, sycl::range{dataSize}};\n        auto bufOut = sycl::buffer{out, sycl::range{dataSize}};\n\n        queue.submit([&](sycl::handler& cgh) {\n            sycl::accessor accInA{bufInA, cgh, sycl::read_write};\n\n            cgh.parallel_for<kernel_a_1>(\n            sycl::range{dataSize}, [=](sycl::id<1> idx) { accInA[idx] *= 2.0f; });\n        });\n\n        queue.submit([&](sycl::handler& cgh) {\n            sycl::accessor accIn{bufInA, cgh, sycl::read_only};\n            sycl::accessor accOut{bufInB, cgh, sycl::read_write};\n\n            cgh.parallel_for<kernel_b_1>(sycl::range{dataSize}, [=](sycl::id<1> idx) {\n                accOut[idx] += accIn[idx];\n            });\n        });\n\n        queue.submit([&](sycl::handler& cgh) {\n            sycl::accessor accInA{bufInA, cgh, sycl::read_only};\n            sycl::accessor accInC{bufInC, cgh, sycl::read_write};\n\n            cgh.parallel_for<kernel_c_1>(sycl::range{dataSize}, [=](sycl::id<1> idx) {\n                accInC[idx] -= accInA[idx];\n            });\n        });\n\n        queue.submit([&](sycl::handler& cgh) {\n            sycl::accessor accInB{bufInB, cgh, sycl::read_only};\n            sycl::accessor accInC{bufInC, cgh, sycl::read_only};\n            sycl::accessor accOut{bufOut, cgh, sycl::write_only};\n\n            cgh.parallel_for<kernel_d_1>(sycl::range{dataSize}, [=](sycl::id<1> idx) {\n                accOut[idx] = accInB[idx] + accInC[idx];\n            });\n        });\n\n        queue.wait_and_throw();\n    } catch (const sycl::exception& e) {\n        std::cout << \"Exception caught: \" << e.what() << std::endl;\n    }\n\n    for (int i = 0; i < dataSize; ++i) {\n        auto val1 = std::to_string(out[i]);\n        auto val2 = std::to_string(i * 2.0f);\n\n        if (val1 == val2) {\n            std::cout << \"Success! \" \n                      << val1\n                      << \" is equal to \" \n                      << val2\n                      << std::endl;\n        } else {\n            std::cout << \"Failure! \" \n                      << val1\n                      << \" is NOT equal to \" \n                      << val2\n                      << std::endl;\n        }\n    }\n}","summary":"Learn how to create a fixed data flow using an in-order queue.","author":{"name":"Scott Straughan","url":"https:\/\/www.linkedin.com\/in\/scott-straughan-b83b25177","avatar":"https:\/\/feeds.sycl.tech\/static\/images\/contributors\/scott.webp","_links":["https:\/\/www.linkedin.com\/in\/scott-straughan-b83b25177"],"_position":"Software Engineer","_affiliation":"Codeplay Software","_id":"7878e7f00c1a2925c570632bad1f7c50799a6b8c","_date_published":"2024-01-31T11:11:59.629762","_summary":"Hello, I am Scott, the web service and design lead at Codeplay Software Ltd.","_username":"scott","_content_html":"<p>Hello, I am Scott, the web service and design lead at Codeplay Software Ltd.<\/p>","_contribution_counts":{"events":18,"projects":54,"news":45,"research_papers":32,"videos":29}},"_tag":"in-order-queue"},{"id":"0fff4b49763e5c32fd7071fb292ffec49614ee68","title":"Matrix Multiply","content_text":"\/\/==============================================================\n\/\/ Copyright \u00a9 2020 Intel Corporation\n\/\/\n\/\/ SPDX-License-Identifier: MIT\n\/\/ =============================================================\n\n\/**\n * Matrix_mul multiplies two large matrices both the CPU and the offload device,\n * then compares results. If the code executes on both CPU and the offload\n * device, the name of the offload device and a success message are displayed.\n *\n * For comprehensive instructions regarding SYCL Programming, go to\n * https:\/\/software.intel.com\/en-us\/oneapi-programming-guide and search based on\n * relevant terms noted in the comments.\n *\/\n\n#include <sycl\/sycl.hpp>\n#include <iostream>\n#include <limits>\n\nusing namespace std;\nusing namespace sycl;\n\n\/**\n * Each element of the product matrix c[i][j] is computed from a unique row and\n * column of the factor matrices, a[i][k] and b[k][j]\n *\/\n\n\/\/ Matrix size constants.\nconstexpr int m_size = 150 * 8;  \/\/ Must be a multiple of 8.\nconstexpr int M = m_size \/ 8;\nconstexpr int N = m_size \/ 4;\nconstexpr int P = m_size \/ 2;\n\n\/**\n * Perform matrix multiplication on host to verify results from device.\n *\/\nint VerifyResult(float (*c_back)[P]);\n\nint main() {\n  \/\/ Host memory buffer that device will write data back before destruction.\n  float(*c_back)[P] = new float[M][P];\n\n  \/\/ Intialize c_back\n  for (int i = 0; i < M; i++)\n    for (int j = 0; j < P; j++) c_back[i][j] = 0.0f;\n\n  \/\/ Initialize the device queue with the default selector. The device queue is\n  \/\/ used to enqueue kernels. It encapsulates all states needed for execution.\n  try {\n    queue q(default_selector_v);\n\n    std::cout << \"Running on: \"\n              << q.get_device().get_info<sycl::info::device::name>()\n              << \"\\n\";\n\n    \/\/ Create 2D buffers for matrices, buffer c is bound with host memory c_back\n\n    buffer<float, 2> a_buf(range(M, N));\n    buffer<float, 2> b_buf(range(N, P));\n    buffer c_buf(reinterpret_cast<float *>(c_back), range(M, P));\n\n    cout << \"Problem size: c(\" << M << \",\" << P << \") = a(\" << M << \",\" << N\n         << \") * b(\" << N << \",\" << P << \")\\n\";\n\n    \/\/ Using three command groups to illustrate execution order. The use of\n    \/\/ first two command groups for initializing matrices is not the most\n    \/\/ efficient way. It just demonstrates the implicit multiple command group\n    \/\/ execution ordering.\n\n    \/\/ Submit command group to queue to initialize matrix a\n    q.submit([&](auto &h) {\n      \/\/ Get write only access to the buffer on a device.\n      accessor a(a_buf, h, write_only);\n\n      \/\/ Execute kernel.\n      h.parallel_for(range(M, N), [=](auto index) {\n        \/\/ Each element of matrix a is 1.\n        a[index] = 1.0f;\n      });\n    });\n\n    \/\/ Submit command group to queue to initialize matrix b\n    q.submit([&](auto &h) {\n      \/\/ Get write only access to the buffer on a device\n      accessor b(b_buf, h, write_only);\n\n      \/\/ Execute kernel.\n      h.parallel_for(range(N, P), [=](auto index) {\n        \/\/ Each column of b is the sequence 1,2,...,N\n        b[index] = index[0] + 1.0f;\n      });\n    });\n\n    \/\/ Submit command group to queue to multiply matrices: c = a * b\n    q.submit([&](auto &h) {\n      \/\/ Read from a and b, write to c\n      accessor a(a_buf, h, read_only);\n      accessor b(b_buf, h, read_only);\n      accessor c(c_buf, h, write_only);\n\n      int width_a = a_buf.get_range()[1];\n\n      \/\/ Execute kernel.\n      h.parallel_for(range(M, P), [=](auto index) {\n        \/\/ Get global position in Y direction.\n        int row = index[0];\n        \/\/ Get global position in X direction.\n        int col = index[1];\n\n        float sum = 0.0f;\n\n        \/\/ Compute the result of one element of c\n        for (int i = 0; i < width_a; i++) {\n          sum += a[row][i] * b[i][col];\n        }\n\n        c[index] = sum;\n      });\n    });\n  } catch (sycl::exception const &e) {\n    cout << \"An exception is caught while multiplying matrices.\\n\";\n    terminate();\n  }\n\n  int result;\n  cout << \"Result of matrix multiplication using SYCL: \";\n  result = VerifyResult(c_back);\n  delete[] c_back;\n\n  return result;\n}\n\nbool ValueSame(float a, float b) {\n  return fabs(a - b) < numeric_limits<float>::epsilon();\n}\n\nint VerifyResult(float (*c_back)[P]) {\n  \/\/ Check that the results are correct by comparing with host computing.\n  int i, j, k;\n\n  \/\/ 2D arrays on host side.\n  float(*a_host)[N] = new float[M][N];\n  float(*b_host)[P] = new float[N][P];\n  float(*c_host)[P] = new float[M][P];\n\n  \/\/ Each element of matrix a is 1.\n  for (i = 0; i < M; i++)\n    for (j = 0; j < N; j++) a_host[i][j] = 1.0f;\n\n  \/\/ Each column of b_host is the sequence 1,2,...,N\n  for (i = 0; i < N; i++)\n    for (j = 0; j < P; j++) b_host[i][j] = i + 1.0f;\n\n  \/\/ c_host is initialized to zero.\n  for (i = 0; i < M; i++)\n    for (j = 0; j < P; j++) c_host[i][j] = 0.0f;\n\n  for (i = 0; i < M; i++) {\n    for (k = 0; k < N; k++) {\n      \/\/ Each element of the product is just the sum 1+2+...+n\n      for (j = 0; j < P; j++) {\n        c_host[i][j] += a_host[i][k] * b_host[k][j];\n      }\n    }\n  }\n\n  bool mismatch_found = false;\n\n  \/\/ Compare host side results with the result buffer from device side: print\n  \/\/ mismatched data 5 times only.\n  int print_count = 0;\n\n  for (i = 0; i < M; i++) {\n    for (j = 0; j < P; j++) {\n      if (!ValueSame(c_back[i][j], c_host[i][j])) {\n        cout << \"Fail - The result is incorrect for element: [\" << i << \", \"\n             << j << \"], expected: \" << c_host[i][j]\n             << \", but found: \" << c_back[i][j] << \"\\n\";\n        mismatch_found = true;\n        print_count++;\n        if (print_count == 5) break;\n      }\n    }\n\n    if (print_count == 5) break;\n  }\n\n  delete[] a_host;\n  delete[] b_host;\n  delete[] c_host;\n\n  if (!mismatch_found) {\n    cout << \"Success - The results are correct!\\n\";\n    return 0;\n  } else {\n    cout << \"Fail - The results mismatch!\\n\";\n    return -1;\n  }\n}","summary":"Learn how to perform matrix multiplication using SYCL.","author":{"name":"Max Brunton","url":"https:\/\/www.linkedin.com\/in\/max-brunton","avatar":"https:\/\/feeds.sycl.tech\/static\/images\/contributors\/max.webp","_links":["https:\/\/www.linkedin.com\/in\/max-brunton"],"_position":"Senior Marketing Manager","_affiliation":"Codeplay Software","_id":"3c2653007408b8627c0acf1107d4a73defc35205","_date_published":"2024-01-31T11:11:59.629762","_summary":"Hello, I am Max, a senior marketing manager at Codeplay Software Ltd.","_username":"max","_content_html":"<p>Hello, I am Max, a senior marketing manager at Codeplay Software Ltd.<\/p>","_contribution_counts":{"events":24,"projects":39,"news":51,"research_papers":11,"videos":73}},"_tag":"matrix-multiply"},{"id":"500d30f19a029f9e84eef6fa4ebb6e12a223341f","title":"Matrix Transpose","content_text":"#include <iostream>\n#include <sycl\/sycl.hpp>\n\nclass kernel_a_1;\nclass kernel_b_1;\nclass kernel_c_1;\nclass kernel_d_1;\n\nint main(int, char**) {\n    constexpr size_t dataSize = 256;\n\n    float inA[dataSize], inB[dataSize], inC[dataSize], out[dataSize];\n    for (int i = 0; i < dataSize; ++i) {\n        inA[i] = static_cast<float>(i);\n        inB[i] = static_cast<float>(i);\n        inC[i] = static_cast<float>(i);\n        out[i] = 0.0f;\n    }\n\n    try {\n        auto queue = sycl::queue{sycl::default_selector_v,\n                    {sycl::property::queue::in_order{}}};\n\n        std::cout << \"Running on: \"\n              << queue.get_device().get_info<sycl::info::device::name>()\n              << \"\\n\";\n\n        auto bufInA = sycl::buffer{inA, sycl::range{dataSize}};\n        auto bufInB = sycl::buffer{inB, sycl::range{dataSize}};\n        auto bufInC = sycl::buffer{inC, sycl::range{dataSize}};\n        auto bufOut = sycl::buffer{out, sycl::range{dataSize}};\n\n        queue.submit([&](sycl::handler& cgh) {\n            sycl::accessor accInA{bufInA, cgh, sycl::read_write};\n\n            cgh.parallel_for<kernel_a_1>(\n            sycl::range{dataSize}, [=](sycl::id<1> idx) { accInA[idx] *= 2.0f; });\n        });\n\n        queue.submit([&](sycl::handler& cgh) {\n            sycl::accessor accIn{bufInA, cgh, sycl::read_only};\n            sycl::accessor accOut{bufInB, cgh, sycl::read_write};\n\n            cgh.parallel_for<kernel_b_1>(sycl::range{dataSize}, [=](sycl::id<1> idx) {\n                accOut[idx] += accIn[idx];\n            });\n        });\n\n        queue.submit([&](sycl::handler& cgh) {\n            sycl::accessor accInA{bufInA, cgh, sycl::read_only};\n            sycl::accessor accInC{bufInC, cgh, sycl::read_write};\n\n            cgh.parallel_for<kernel_c_1>(sycl::range{dataSize}, [=](sycl::id<1> idx) {\n                accInC[idx] -= accInA[idx];\n            });\n        });\n\n        queue.submit([&](sycl::handler& cgh) {\n            sycl::accessor accInB{bufInB, cgh, sycl::read_only};\n            sycl::accessor accInC{bufInC, cgh, sycl::read_only};\n            sycl::accessor accOut{bufOut, cgh, sycl::write_only};\n\n            cgh.parallel_for<kernel_d_1>(sycl::range{dataSize}, [=](sycl::id<1> idx) {\n                accOut[idx] = accInB[idx] + accInC[idx];\n            });\n        });\n\n        queue.wait_and_throw();\n    } catch (const sycl::exception& e) {\n        std::cout << \"Exception caught: \" << e.what() << std::endl;\n    }\n\n    for (int i = 0; i < dataSize; ++i) {\n        auto val1 = std::to_string(out[i]);\n        auto val2 = std::to_string(i * 2.0f);\n\n        if (val1 == val2) {\n            std::cout << \"Success! \" \n                      << val1\n                      << \" is equal to \" \n                      << val2\n                      << std::endl;\n        } else {\n            std::cout << \"Failure! \" \n                      << val1\n                      << \" is NOT equal to \" \n                      << val2\n                      << std::endl;\n        }\n    }\n}","summary":"Use GPU specific features in order to gain good GPU performance.","author":{"name":"Max Brunton","url":"https:\/\/www.linkedin.com\/in\/max-brunton","avatar":"https:\/\/feeds.sycl.tech\/static\/images\/contributors\/max.webp","_links":["https:\/\/www.linkedin.com\/in\/max-brunton"],"_position":"Senior Marketing Manager","_affiliation":"Codeplay Software","_id":"3c2653007408b8627c0acf1107d4a73defc35205","_date_published":"2024-01-31T11:11:59.629762","_summary":"Hello, I am Max, a senior marketing manager at Codeplay Software Ltd.","_username":"max","_content_html":"<p>Hello, I am Max, a senior marketing manager at Codeplay Software Ltd.<\/p>","_contribution_counts":{"events":24,"projects":39,"news":51,"research_papers":11,"videos":73}},"_tag":"matrix-transpose"},{"id":"d094b53106b413617aa6dfee478c450d14cab2de","title":"ND Range Kernel","content_text":"#include <iostream>\n#include <sycl\/sycl.hpp>\n\nclass vector_add_2;\n\nint main(int, char**) {\n    constexpr size_t dataSize = 1024;\n    constexpr size_t workGroupSize = 128;\n\n    int a[dataSize], b[dataSize], r[dataSize];\n    for (int i = 0; i < dataSize; ++i) {\n        a[i] = i;\n        b[i] = i;\n        r[i] = 0;\n    }\n\n    try {\n        auto queue = sycl::queue{sycl::default_selector_v};\n\n        std::cout << \"Running on: \"\n              << queue.get_device().get_info<sycl::info::device::name>()\n              << \"\\n\";\n\n        auto bufA = sycl::buffer{a, sycl::range{dataSize}};\n        auto bufB = sycl::buffer{b, sycl::range{dataSize}};\n        auto bufR = sycl::buffer{r, sycl::range{dataSize}};\n\n        queue.submit([&](sycl::handler& cgh) {\n            sycl::accessor accA{bufA, cgh, sycl::read_write};\n            sycl::accessor accB{bufB, cgh, sycl::read_write};\n            sycl::accessor accR{bufR, cgh, sycl::read_write};\n\n            auto ndRange =\n            sycl::nd_range{sycl::range{dataSize}, sycl::range{workGroupSize}};\n\n            cgh.parallel_for<vector_add_2>(ndRange, [=](sycl::nd_item<1> itm) {\n                auto globalId = itm.get_global_id();\n                accR[globalId] = accA[globalId] + accB[globalId];\n            });\n        });\n\n        queue.throw_asynchronous();\n    } catch (const sycl::exception& e) {\n        std::cout << \"Exception caught: \" << e.what() << std::endl;\n    }\n\n    for (int i = 0; i < dataSize; ++i) {\n        if (r[i] == i * 2) {\n            std::cout << \"Success! Values match.\" << std::endl;\n        } else {\n            std::cout << \"Failure! Values do not match.\" << std::endl;\n        }\n    }\n}","summary":"Learn how to enqueue ND range kernel functions.","author":{"name":"Rod Burns","url":"https:\/\/www.linkedin.com\/in\/roderickburns","avatar":"https:\/\/feeds.sycl.tech\/static\/images\/contributors\/rod.webp","_links":["https:\/\/www.linkedin.com\/in\/roderickburns","https:\/\/twitter.com\/rodburns"],"_position":"VP of Ecosystem and UXL Foundation Chair","_affiliation":"Codeplay Software","_id":"f14aa97fb4ced09128edd220caf28a946c7c700e","_date_published":"2024-01-31T11:11:59.629762","_summary":"Rod is the VP Ecosystem at Codeplay responsible for ensuring developers are successful in building g..","_username":"rod","_content_html":"<p>Rod is the VP Ecosystem at Codeplay responsible for ensuring developers are successful in building great software \nusing Codeplay products. Rod is also the UXL Foundation chair.<\/p>","_contribution_counts":{"events":22,"projects":51,"news":60,"research_papers":4,"videos":30}},"_tag":"nd-range-kernel"},{"id":"b09fd68c5f7443c5eb1d68bc4b907b0c4907b0a5","title":"Vector Addition","content_text":"#include <iostream>\n#include <sycl\/sycl.hpp>\n\nclass vector_addition;\n\nint main(int, char**) {\n    sycl::float4 a = { 1.0, 2.0, 3.0, 4.0 };\n    sycl::float4 b = { 4.0, 3.0, 2.0, 1.0 };\n    sycl::float4 c = { 0.0, 0.0, 0.0, 0.0 };\n\n    auto device_selector = sycl::default_selector_v;\n\n    sycl::queue queue(device_selector);\n    \n    std::cout << \"Running on: \"\n              << queue.get_device().get_info<sycl::info::device::name>()\n              << \"\\n\";\n\n    {\n        sycl::buffer<sycl::float4, 1> a_sycl(&a, sycl::range<1>(1));\n        sycl::buffer<sycl::float4, 1> b_sycl(&b, sycl::range<1>(1));\n        sycl::buffer<sycl::float4, 1> c_sycl(&c, sycl::range<1>(1));\n\n        queue.submit([&] (sycl::handler& cgh) {\n            auto a_acc = a_sycl.get_access<sycl::access::mode::read>(cgh);\n            auto b_acc = b_sycl.get_access<sycl::access::mode::read>(cgh);\n            auto c_acc = c_sycl.get_access<sycl::access::mode::discard_write>(cgh);\n\n            cgh.single_task<class vector_addition>([=] () {\n                c_acc[0] = a_acc[0] + b_acc[0];\n            });\n        });\n    }\n    std::cout << \"  A { \" << a.x() << \", \" << a.y() << \", \" << a.z() << \", \" << a.w() << \" }\\n\"\n              << \"+ B { \" << b.x() << \", \" << b.y() << \", \" << b.z() << \", \" << b.w() << \" }\\n\"\n              << \"==================\\n\"\n              << \"= C { \" << c.x() << \", \" << c.y() << \", \" << c.z() << \", \" << c.w() << \" }\"\n              << std::endl;\n\n    return 0;\n}","summary":"Learn how to perform vector addition using SYCL.","author":{"name":"Rod Burns","url":"https:\/\/www.linkedin.com\/in\/roderickburns","avatar":"https:\/\/feeds.sycl.tech\/static\/images\/contributors\/rod.webp","_links":["https:\/\/www.linkedin.com\/in\/roderickburns","https:\/\/twitter.com\/rodburns"],"_position":"VP of Ecosystem and UXL Foundation Chair","_affiliation":"Codeplay Software","_id":"f14aa97fb4ced09128edd220caf28a946c7c700e","_date_published":"2024-01-31T11:11:59.629762","_summary":"Rod is the VP Ecosystem at Codeplay responsible for ensuring developers are successful in building g..","_username":"rod","_content_html":"<p>Rod is the VP Ecosystem at Codeplay responsible for ensuring developers are successful in building great software \nusing Codeplay products. Rod is also the UXL Foundation chair.<\/p>","_contribution_counts":{"events":22,"projects":51,"news":60,"research_papers":4,"videos":30}},"_cached_response":"A { 1, 2, 3, 4 }\n+ B { 4, 3, 2, 1 }\n==================\n= C { 5, 5, 5, 5 }\n","_tag":"vector-addition"}],"_filters":{},"_page":1,"_total_pages":1,"_total_items":6}