1 /*
2 * Copyright (C) 2018-2021 Intel Corporation
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 */
7
8 #include "shared/source/compiler_interface/oclc_extensions.h"
9
10 #include "shared/source/debug_settings/debug_settings_manager.h"
11 #include "shared/source/helpers/hw_info.h"
12 #include "shared/source/helpers/string.h"
13
14 #include <string>
15
16 namespace NEO {
17 const char *deviceExtensionsList = "cl_khr_byte_addressable_store "
18 "cl_khr_fp16 "
19 "cl_khr_global_int32_base_atomics "
20 "cl_khr_global_int32_extended_atomics "
21 "cl_khr_icd "
22 "cl_khr_local_int32_base_atomics "
23 "cl_khr_local_int32_extended_atomics "
24 "cl_intel_command_queue_families "
25 "cl_intel_subgroups "
26 "cl_intel_required_subgroup_size "
27 "cl_intel_subgroups_short "
28 "cl_khr_spir "
29 "cl_intel_accelerator "
30 "cl_intel_driver_diagnostics "
31 "cl_khr_priority_hints "
32 "cl_khr_throttle_hints "
33 "cl_khr_create_command_queue "
34 "cl_intel_subgroups_char "
35 "cl_intel_subgroups_long "
36 "cl_khr_il_program "
37 "cl_intel_mem_force_host_memory "
38 "cl_khr_subgroup_extended_types "
39 "cl_khr_subgroup_non_uniform_vote "
40 "cl_khr_subgroup_ballot "
41 "cl_khr_subgroup_non_uniform_arithmetic "
42 "cl_khr_subgroup_shuffle "
43 "cl_khr_subgroup_shuffle_relative "
44 "cl_khr_subgroup_clustered_reduce "
45 "cl_intel_device_attribute_query "
46 "cl_khr_suggested_local_work_size ";
47
getExtensionsList(const HardwareInfo & hwInfo)48 std::string getExtensionsList(const HardwareInfo &hwInfo) {
49 std::string allExtensionsList;
50 allExtensionsList.reserve(1000);
51
52 allExtensionsList.append(deviceExtensionsList);
53
54 if (hwInfo.capabilityTable.supportsOcl21Features) {
55 allExtensionsList += "cl_khr_subgroups ";
56 if (hwInfo.capabilityTable.supportsVme) {
57 allExtensionsList += "cl_intel_spirv_device_side_avc_motion_estimation ";
58 }
59 if (hwInfo.capabilityTable.supportsMediaBlock) {
60 allExtensionsList += "cl_intel_spirv_media_block_io ";
61 }
62 allExtensionsList += "cl_intel_spirv_subgroups ";
63 allExtensionsList += "cl_khr_spirv_no_integer_wrap_decoration ";
64 }
65
66 if (hwInfo.capabilityTable.ftrSupportsFP64) {
67 allExtensionsList += "cl_khr_fp64 ";
68 }
69
70 if (hwInfo.capabilityTable.ftrSupportsInteger64BitAtomics) {
71 allExtensionsList += "cl_khr_int64_base_atomics ";
72 allExtensionsList += "cl_khr_int64_extended_atomics ";
73 }
74
75 if (hwInfo.capabilityTable.supportsImages) {
76 allExtensionsList += "cl_khr_3d_image_writes ";
77 }
78
79 if (hwInfo.capabilityTable.supportsVme) {
80 allExtensionsList += "cl_intel_motion_estimation cl_intel_device_side_avc_motion_estimation ";
81 }
82
83 return allExtensionsList;
84 }
85
getOpenclCFeaturesList(const HardwareInfo & hwInfo,OpenClCFeaturesContainer & openclCFeatures)86 void getOpenclCFeaturesList(const HardwareInfo &hwInfo, OpenClCFeaturesContainer &openclCFeatures) {
87 cl_name_version openClCFeature;
88 openClCFeature.version = CL_MAKE_VERSION(3, 0, 0);
89
90 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_int64");
91 openclCFeatures.push_back(openClCFeature);
92
93 if (hwInfo.capabilityTable.supportsImages) {
94 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_3d_image_writes");
95 openclCFeatures.push_back(openClCFeature);
96
97 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_images");
98 openclCFeatures.push_back(openClCFeature);
99
100 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_read_write_images");
101 openclCFeatures.push_back(openClCFeature);
102 }
103
104 if (hwInfo.capabilityTable.supportsOcl21Features) {
105 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_atomic_order_acq_rel");
106 openclCFeatures.push_back(openClCFeature);
107
108 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_atomic_order_seq_cst");
109 openclCFeatures.push_back(openClCFeature);
110
111 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_atomic_scope_all_devices");
112 openclCFeatures.push_back(openClCFeature);
113
114 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_atomic_scope_device");
115 openclCFeatures.push_back(openClCFeature);
116
117 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_generic_address_space");
118 openclCFeatures.push_back(openClCFeature);
119
120 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_program_scope_global_variables");
121 openclCFeatures.push_back(openClCFeature);
122
123 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_work_group_collective_functions");
124 openclCFeatures.push_back(openClCFeature);
125
126 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_subgroups");
127 openclCFeatures.push_back(openClCFeature);
128 }
129
130 auto forceDeviceEnqueueSupport = DebugManager.flags.ForceDeviceEnqueueSupport.get();
131 if ((hwInfo.capabilityTable.supportsDeviceEnqueue && (forceDeviceEnqueueSupport == -1)) ||
132 (forceDeviceEnqueueSupport == 1)) {
133 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_device_enqueue");
134 openclCFeatures.push_back(openClCFeature);
135 }
136
137 auto forcePipeSupport = DebugManager.flags.ForcePipeSupport.get();
138 if ((hwInfo.capabilityTable.supportsPipes && (forcePipeSupport == -1)) ||
139 (forcePipeSupport == 1)) {
140 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_pipes");
141 openclCFeatures.push_back(openClCFeature);
142 }
143
144 auto forceFp64Support = DebugManager.flags.OverrideDefaultFP64Settings.get();
145 if ((hwInfo.capabilityTable.ftrSupportsFP64 && (forceFp64Support == -1)) ||
146 (forceFp64Support == 1)) {
147 strcpy_s(openClCFeature.name, CL_NAME_VERSION_MAX_NAME_SIZE, "__opencl_c_fp64");
148 openclCFeatures.push_back(openClCFeature);
149 }
150 }
151
convertEnabledExtensionsToCompilerInternalOptions(const char * enabledExtensions,OpenClCFeaturesContainer & openclCFeatures)152 std::string convertEnabledExtensionsToCompilerInternalOptions(const char *enabledExtensions,
153 OpenClCFeaturesContainer &openclCFeatures) {
154
155 std::string extensionsList = enabledExtensions;
156 extensionsList.reserve(1500);
157 extensionsList = " -cl-ext=-all,";
158 std::istringstream extensionsStringStream(enabledExtensions);
159 std::string extension;
160 while (extensionsStringStream >> extension) {
161 extensionsList.append("+");
162 extensionsList.append(extension);
163 extensionsList.append(",");
164 }
165 for (auto &feature : openclCFeatures) {
166 extensionsList.append("+");
167 extensionsList.append(feature.name);
168 extensionsList.append(",");
169 }
170 extensionsList[extensionsList.size() - 1] = ' ';
171
172 return extensionsList;
173 }
174
getOclVersionCompilerInternalOption(unsigned int oclVersion)175 std::string getOclVersionCompilerInternalOption(unsigned int oclVersion) {
176 switch (oclVersion) {
177 case 30:
178 return "-ocl-version=300 ";
179 case 21:
180 return "-ocl-version=210 ";
181 default:
182 return "-ocl-version=120 ";
183 }
184 }
185
186 } // namespace NEO
187