test_local_buffer.cpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. //---------------------------------------------------------------------------//
  2. // Copyright (c) 2013-2014 Kyle Lutz <kyle.r.lutz@gmail.com>
  3. //
  4. // Distributed under the Boost Software License, Version 1.0
  5. // See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt
  7. //
  8. // See http://boostorg.github.com/compute for more information.
  9. //---------------------------------------------------------------------------//
  10. #define BOOST_TEST_MODULE TestLocalBuffer
  11. #include <boost/test/unit_test.hpp>
  12. #include <iostream>
  13. #include <boost/compute/core.hpp>
  14. #include <boost/compute/memory/local_buffer.hpp>
  15. #include <boost/compute/utility/source.hpp>
  16. #include "context_setup.hpp"
  17. namespace compute = boost::compute;
  18. BOOST_AUTO_TEST_CASE(local_buffer_arg)
  19. {
  20. if(device.get_info<CL_DEVICE_LOCAL_MEM_TYPE>() != CL_LOCAL){
  21. std::cerr << "skipping local buffer arg test: "
  22. << "device does not support local memory" << std::endl;
  23. return;
  24. }
  25. const char source[] = BOOST_COMPUTE_STRINGIZE_SOURCE(
  26. __kernel void foo(__local float *local_buffer,
  27. __global float *global_buffer)
  28. {
  29. const uint gid = get_global_id(0);
  30. const uint lid = get_local_id(0);
  31. local_buffer[lid] = gid;
  32. global_buffer[gid] = local_buffer[lid];
  33. }
  34. );
  35. // create and build program
  36. compute::program program =
  37. compute::program::build_with_source(source, context);
  38. // create kernel
  39. compute::kernel kernel = program.create_kernel("foo");
  40. // setup kernel arguments
  41. compute::buffer global_buf(context, 128 * sizeof(float));
  42. kernel.set_arg(0, compute::local_buffer<float>(32));
  43. kernel.set_arg(1, global_buf);
  44. // some implementations don't correctly report dynamically-set local buffer sizes
  45. if(kernel.get_work_group_info<cl_ulong>(device, CL_KERNEL_LOCAL_MEM_SIZE) == 0){
  46. std::cerr << "skipping checks for local memory size, device reports "
  47. << "zero after setting dynamically-sized local buffer size"
  48. << std::endl;
  49. return;
  50. }
  51. // check actual memory size
  52. BOOST_CHECK_GE(
  53. kernel.get_work_group_info<cl_ulong>(device, CL_KERNEL_LOCAL_MEM_SIZE),
  54. 32 * sizeof(float)
  55. );
  56. // increase local buffer size and check new actual local memory size
  57. kernel.set_arg(0, compute::local_buffer<float>(64));
  58. BOOST_CHECK_GE(
  59. kernel.get_work_group_info<cl_ulong>(device, CL_KERNEL_LOCAL_MEM_SIZE),
  60. 64 * sizeof(float)
  61. );
  62. }
  63. BOOST_AUTO_TEST_SUITE_END()