我的代码在尝试使用时遇到问题 我的 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 可以帮助我吗?