@@ -931,44 +931,142 @@ pi_result cuda_piDeviceGetInfo(pi_device device, pi_device_info param_name,
931931 }
932932 case PI_DEVICE_INFO_IMAGE_SUPPORT: {
933933 return getInfo (param_value_size, param_value, param_value_size_ret,
934- PI_FALSE );
934+ PI_TRUE );
935935 }
936936 case PI_DEVICE_INFO_MAX_READ_IMAGE_ARGS: {
937- return getInfo (param_value_size, param_value, param_value_size_ret, 0 );
937+ // This call doesn't match to CUDA as it doesn't have images, but instead
938+ // surfaces and textures. No clear call in the CUDA API to determine this,
939+ // but some searching found as of SM 2.x 128 are supported.
940+ return getInfo (param_value_size, param_value, param_value_size_ret, 128u );
938941 }
939942 case PI_DEVICE_INFO_MAX_WRITE_IMAGE_ARGS: {
940- return getInfo (param_value_size, param_value, param_value_size_ret, 0u );
943+ // This call doesn't match to CUDA as it doesn't have images, but instead
944+ // surfaces and textures. No clear call in the CUDA API to determine this,
945+ // but some searching found as of SM 2.x 128 are supported.
946+ return getInfo (param_value_size, param_value, param_value_size_ret, 128u );
941947 }
942948 case PI_DEVICE_INFO_IMAGE2D_MAX_HEIGHT: {
943- return getInfo (param_value_size, param_value, param_value_size_ret,
944- size_t (0 ));
949+ // Take the smaller of maximum surface and maximum texture height.
950+ int tex_height = 0 ;
951+ cl::sycl::detail::pi::assertion (
952+ cuDeviceGetAttribute (&tex_height,
953+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_HEIGHT,
954+ device->get ()) == CUDA_SUCCESS);
955+ cl::sycl::detail::pi::assertion (tex_height >= 0 );
956+ int surf_height = 0 ;
957+ cl::sycl::detail::pi::assertion (
958+ cuDeviceGetAttribute (&surf_height,
959+ CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_HEIGHT,
960+ device->get ()) == CUDA_SUCCESS);
961+ cl::sycl::detail::pi::assertion (surf_height >= 0 );
962+
963+ int min = std::min (tex_height, surf_height);
964+
965+ return getInfo (param_value_size, param_value, param_value_size_ret, min);
945966 }
946967 case PI_DEVICE_INFO_IMAGE2D_MAX_WIDTH: {
947- return getInfo (param_value_size, param_value, param_value_size_ret,
948- size_t (0 ));
968+ // Take the smaller of maximum surface and maximum texture width.
969+ int tex_width = 0 ;
970+ cl::sycl::detail::pi::assertion (
971+ cuDeviceGetAttribute (&tex_width,
972+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_WIDTH,
973+ device->get ()) == CUDA_SUCCESS);
974+ cl::sycl::detail::pi::assertion (tex_width >= 0 );
975+ int surf_width = 0 ;
976+ cl::sycl::detail::pi::assertion (
977+ cuDeviceGetAttribute (&surf_width,
978+ CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_WIDTH,
979+ device->get ()) == CUDA_SUCCESS);
980+ cl::sycl::detail::pi::assertion (surf_width >= 0 );
981+
982+ int min = std::min (tex_width, surf_width);
983+
984+ return getInfo (param_value_size, param_value, param_value_size_ret, min);
949985 }
950986 case PI_DEVICE_INFO_IMAGE3D_MAX_HEIGHT: {
951- return getInfo (param_value_size, param_value, param_value_size_ret,
952- size_t (0 ));
987+ // Take the smaller of maximum surface and maximum texture height.
988+ int tex_height = 0 ;
989+ cl::sycl::detail::pi::assertion (
990+ cuDeviceGetAttribute (&tex_height,
991+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT,
992+ device->get ()) == CUDA_SUCCESS);
993+ cl::sycl::detail::pi::assertion (tex_height >= 0 );
994+ int surf_height = 0 ;
995+ cl::sycl::detail::pi::assertion (
996+ cuDeviceGetAttribute (&surf_height,
997+ CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_HEIGHT,
998+ device->get ()) == CUDA_SUCCESS);
999+ cl::sycl::detail::pi::assertion (surf_height >= 0 );
1000+
1001+ int min = std::min (tex_height, surf_height);
1002+
1003+ return getInfo (param_value_size, param_value, param_value_size_ret, min);
9531004 }
9541005 case PI_DEVICE_INFO_IMAGE3D_MAX_WIDTH: {
955- return getInfo (param_value_size, param_value, param_value_size_ret,
956- size_t (0 ));
1006+ // Take the smaller of maximum surface and maximum texture width.
1007+ int tex_width = 0 ;
1008+ cl::sycl::detail::pi::assertion (
1009+ cuDeviceGetAttribute (&tex_width,
1010+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH,
1011+ device->get ()) == CUDA_SUCCESS);
1012+ cl::sycl::detail::pi::assertion (tex_width >= 0 );
1013+ int surf_width = 0 ;
1014+ cl::sycl::detail::pi::assertion (
1015+ cuDeviceGetAttribute (&surf_width,
1016+ CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_WIDTH,
1017+ device->get ()) == CUDA_SUCCESS);
1018+ cl::sycl::detail::pi::assertion (surf_width >= 0 );
1019+
1020+ int min = std::min (tex_width, surf_width);
1021+
1022+ return getInfo (param_value_size, param_value, param_value_size_ret, min);
9571023 }
9581024 case PI_DEVICE_INFO_IMAGE3D_MAX_DEPTH: {
959- return getInfo (param_value_size, param_value, param_value_size_ret,
960- size_t (0 ));
1025+ // Take the smaller of maximum surface and maximum texture depth.
1026+ int tex_depth = 0 ;
1027+ cl::sycl::detail::pi::assertion (
1028+ cuDeviceGetAttribute (&tex_depth,
1029+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH,
1030+ device->get ()) == CUDA_SUCCESS);
1031+ cl::sycl::detail::pi::assertion (tex_depth >= 0 );
1032+ int surf_depth = 0 ;
1033+ cl::sycl::detail::pi::assertion (
1034+ cuDeviceGetAttribute (&surf_depth,
1035+ CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_DEPTH,
1036+ device->get ()) == CUDA_SUCCESS);
1037+ cl::sycl::detail::pi::assertion (surf_depth >= 0 );
1038+
1039+ int min = std::min (tex_depth, surf_depth);
1040+
1041+ return getInfo (param_value_size, param_value, param_value_size_ret, min);
9611042 }
9621043 case PI_DEVICE_INFO_IMAGE_MAX_BUFFER_SIZE: {
963- return getInfo (param_value_size, param_value, param_value_size_ret,
964- size_t (0 ));
1044+ // Take the smaller of maximum surface and maximum texture width.
1045+ int tex_width = 0 ;
1046+ cl::sycl::detail::pi::assertion (
1047+ cuDeviceGetAttribute (&tex_width,
1048+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH,
1049+ device->get ()) == CUDA_SUCCESS);
1050+ cl::sycl::detail::pi::assertion (tex_width >= 0 );
1051+ int surf_width = 0 ;
1052+ cl::sycl::detail::pi::assertion (
1053+ cuDeviceGetAttribute (&surf_width,
1054+ CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_WIDTH,
1055+ device->get ()) == CUDA_SUCCESS);
1056+ cl::sycl::detail::pi::assertion (surf_width >= 0 );
1057+
1058+ int min = std::min (tex_width, surf_width);
1059+
1060+ return getInfo (param_value_size, param_value, param_value_size_ret, min);
9651061 }
9661062 case PI_DEVICE_INFO_IMAGE_MAX_ARRAY_SIZE: {
9671063 return getInfo (param_value_size, param_value, param_value_size_ret,
9681064 size_t (0 ));
9691065 }
9701066 case PI_DEVICE_INFO_MAX_SAMPLERS: {
971- return getInfo (param_value_size, param_value, param_value_size_ret, 0u );
1067+ // This call is kind of meaningless for cuda, as samplers don't exist.
1068+ // Closest thing is textures, which is 128.
1069+ return getInfo (param_value_size, param_value, param_value_size_ret, 128u );
9721070 }
9731071 case PI_DEVICE_INFO_MAX_PARAMETER_SIZE: {
9741072 // https://docs.nvidia.com/cuda/cuda-c-programming-guide/#function-parameters
0 commit comments