oneapi-src / oneDNN

oneAPI Deep Neural Network Library (oneDNN)
https://uxlfoundation.org
Apache License 2.0
3.59k stars 989 forks source link

could not create a primitive descriptor iterator #1927

Closed wangzy0327 closed 3 months ago

wangzy0327 commented 4 months ago

Summary

oneDNN primitive binary

oneDNN error caught: Status: unimplemented Message: could not create a primitive descriptor iterator Example failed on GPU.

Version

oneDNN v2.5 in verbose mode.

Environment

Steps to reproduce

oneDNN version v2.5 offical example primitive binary

binary-make.cpp ``` /******************************************************************************* * Copyright 2020 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ /// @example binary.cpp /// > Annotated version: @ref binary_example_cpp /// /// @page binary_example_cpp_short /// /// This C++ API example demonstrates how to create and execute a /// [Binary](@ref dev_guide_binary) primitive. /// /// Key optimizations included in this example: /// - In-place primitive execution; /// - Primitive attributes with fused post-ops. /// /// @page binary_example_cpp Binary Primitive Example /// @copydetails binary_example_cpp_short /// /// @include binary.cpp #include #include #include #include #include #include "example_utils.hpp" #include "oneapi/dnnl/dnnl.hpp" using namespace dnnl; using tag = memory::format_tag; using dt = memory::data_type; void binary_example(dnnl::engine::kind engine_kind) { // Create execution dnnl::engine. dnnl::engine engine(engine_kind, 0); // Create dnnl::stream. dnnl::stream engine_stream(engine); // Tensor dimensions. const memory::dim N = 3, // batch size IC = 3, // channels IH = 150, // tensor height IW = 150; // tensor width // Source (src_0 and src_1) and destination (dst) tensors dimensions. memory::dims src_0_dims = {N, IC, IH, IW}; memory::dims src_1_dims = {N, IC, IH, 1}; // Allocate buffers. std::vector src_0_data(product(src_0_dims)); std::vector src_1_data(product(src_1_dims)); // Initialize src_0 and src_1 (src). std::generate(src_0_data.begin(), src_0_data.end(), []() { static int i = 0; return std::cos(i++ / 10.f); }); std::generate(src_1_data.begin(), src_1_data.end(), []() { static int i = 0; return std::sin(i++ * 2.f); }); // Create src and dst memory descriptors. auto src_0_md = memory::desc(src_0_dims, dt::f32, tag::nchw); auto src_1_md = memory::desc(src_1_dims, dt::f32, tag::nchw); auto dst_md = memory::desc(src_0_dims, dt::f32, tag::nchw); sycl::buffer buffer_src0(static_cast(src_0_data.data()), sycl::range<1>(src_0_data.size())); sycl::buffer buffer_src1(static_cast(src_1_data.data()), sycl::range<1>(src_1_data.size())); // Create src memory objects. // auto src_0_mem = memory(src_0_md, engine); // auto src_1_mem = memory(src_1_md, engine); auto src_0_mem = dnnl::sycl_interop::make_memory(src_0_md, engine, buffer_src0); auto src_1_mem = dnnl::sycl_interop::make_memory(src_1_md, engine, buffer_src1); // Write data to memory object's handle. write_to_dnnl_memory(src_0_data.data(), src_0_mem); write_to_dnnl_memory(src_1_data.data(), src_1_mem); // Create operation descriptor. auto binary_d = binary::desc(algorithm::binary_mul, src_0_md, src_1_md, dst_md); // Create primitive post-ops (ReLU). const float scale = 1.0f; const float alpha = 0.f; const float beta = 0.f; post_ops binary_ops; binary_ops.append_eltwise(scale, algorithm::eltwise_relu, alpha, beta); primitive_attr binary_attr; binary_attr.set_post_ops(binary_ops); // Create primitive descriptor. auto binary_pd = binary::primitive_desc(binary_d, binary_attr, engine); // Create the primitive. auto binary_prim = binary(binary_pd); // Primitive arguments. Set up in-place execution by assigning src_0 as DST. std::unordered_map binary_args; binary_args.insert({DNNL_ARG_SRC_0, src_0_mem}); binary_args.insert({DNNL_ARG_SRC_1, src_1_mem}); binary_args.insert({DNNL_ARG_DST, src_0_mem}); // Primitive execution: binary with ReLU. binary_prim.execute(engine_stream, binary_args); // Wait for the computation to finalize. engine_stream.wait(); // Read data from memory object's handle. read_from_dnnl_memory(src_0_data.data(), src_0_mem); int num = std::min(src_0_data.size(),static_cast(100)); for(int i = 0;i < num;i++){ if(i == 0) std::cout<<"[ "; if(i != num - 1) std::cout<

/home/wzy/sycl_workspace/build-cuda-2022-06-debug/bin/clang++ -g -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend --offload-arch=sm_70 binary_make.cpp -o binary_make.out -ldnnl

Observed behavior

oneDNN error caught: Status: unimplemented Message: could not create a primitive descriptor iterator Example failed on GPU.

Expected behavior

Example passed on GPU. @dzarukin Can you help me solve the problem?

dzarukin commented 4 months ago

@wangzy0327, I'm sorry, but we are not supporting v2.5 any longer, only v3.4. And for further assistance, ONEDNN_VERBOSE=all would be needed. Thank you.

wangzy0327 commented 4 months ago

@dzarukin I have build onednn v2.5 using cmake DNNL_VERBOSE option which the replace of ONEDNN_VERBOSE. And how to use the DNNL_VERBOSE in execution?

vpirogov commented 4 months ago

@wangzy0327, please refer to oneDNN verbose mode documentation. You can find content specific to oneDNN v2.5 here.

wangzy0327 commented 4 months ago

@vpirogov @dzarukin Will the v3.4 version of onednn be supported for a long time? Including some interface changes and operator additions?

vpirogov commented 3 months ago

oneDNN v3.4 will be supported with bug fixes until oneDNN v3.5 release and with critical bug fixes after that. New features and performance optimizations will land in future minor releases, including v3.5 and v3.6. In general oneDNN follows semantic versioning scheme: