opencl 在使用除 CL_MEM_USE_HOST_PTR 以外的任何东西时崩溃

问题描述 投票:0回答:0

我的代码在尝试使用时遇到问题 我的 gpu 的 opencl 功能。尤其 我正在开发这个项目: https://github.com/alekstheod/tnnlib

openCL相关代码位于: https://github.com/alekstheod/tnnlib/tree/master/NeuralNetwork/NeuralLayer/OpenCL

基本上有趣的部分在这里:

            void calculate() {
            try {
                using namespace cl;
                auto& ocl = OpenCLProgram::instance();
                const auto& defaultDevice = ocl.devices.front();

                // Create a command queue and use the first device

                const cl_mem_flags inBufFlags = CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR;
                const cl_mem_flags outBufFlags = CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR;

                Buffer weights(ocl.context,
                               inBufFlags,
                               bufferSize * sizeof(float),
                               m_weights.data());

                Buffer values(ocl.context,
                              inBufFlags,
                              bufferSize * sizeof(float),
                              m_inputs.data());

                Buffer product(ocl.context,
                               outBufFlags,
                               size() * sizeof(float),
                               m_dotProducts.data());

                CommandQueue queue(ocl.context, defaultDevice);
                cl::Kernel kernel{ocl.program, "dot_product"};

                // Set arguments to kernel
                kernel.setArg(0, weights);
                kernel.setArg(1, values);
                kernel.setArg(2, product);
                kernel.setArg(3, static_cast< unsigned int >(Internal::inputs()));

                queue.enqueueNDRangeKernel(kernel,
                                           cl::NullRange,
                                           cl::NDRange(size()),
                                           cl::NullRange);

                queue.enqueueReadBuffer(product,
                                        CL_TRUE,
                                        0,
                                        m_dotProducts.size() * sizeof(float),
                                        m_dotProducts.data());

                auto& self = *this;
                for(const auto i : ranges::views::indices(size())) {
                    m_dotProducts[i] += self[i].getBias();
                }

                for(const auto i : ranges::views::indices(size())) {
                    auto& neuron = self[i];
                    neuron.calculateOutput(m_dotProducts[i],
                                           m_dotProducts.begin(),
                                           m_dotProducts.end());
                }
            } catch(const cl::Error& e) {
                std::cerr << "Calculation error" << std::endl;
            }
        }

我的工作流程有什么问题?如果我更改 CL_MEM_USE_HOST_PTR 到类似 CL_MEM_COPY_HOST_PTR 之类的东西,它会使我的 GPU 崩溃。它 确实运行了几个周期,但整个过程都崩溃了。 一些 openCL expect 可以帮助我吗?

c++ neural-network crash opencl amd-gpu
© www.soinside.com 2019 - 2024. All rights reserved.