我正在使用C ++上的(周期性)神经网络。 OpenCL通过深度学习获得一些低级别的体验。现在我有一个简单的前向传播内核,它会产生奇怪的低性能;设置受内存限制,因为大多数深度学习设置,并基于一些粗略的分析,我得到的内存带宽约为2 GB / s。对clGetDeviceInfo()的调用证实我正在使用我的板载GPU(GTX 960m);我怀疑我用clCreateBuffer()以某种方式分配的内存以某种方式结束在CPU上,这将导致传输速率徘徊在this article所建议的2 GB / s左右。我正在分配的缓冲区对于GPU来说不应该太大;最大的是1024 * 1024 * 4字节= 4 MB(权重),只创建了12个。
对clCreateBuffer()的调用,带有一些上下文:
NVector::NVector(int size) {
empty = false;
numNeurons = size;
activationsMem = clCreateBuffer(RNN::clContext, CL_MEM_READ_WRITE, sizeof(float) * numNeurons, NULL, NULL);
parametersMem = clCreateBuffer(RNN::clContext, CL_MEM_READ_WRITE, sizeof(float) * numNeurons, NULL, NULL);
derivativesMem = clCreateBuffer(RNN::clContext, CL_MEM_READ_WRITE, sizeof(float) * numNeurons, NULL, NULL);
}
//...
void NVector::connect(NVector& other) {
int numWeights = other.numNeurons * numNeurons;
cl_mem weightMem = clCreateBuffer(RNN::clContext, CL_MEM_READ_WRITE, sizeof(float) * numWeights, NULL, NULL);
float weightAmplitude = 0.2f;
float* weightData = new float[numWeights];
for (int i = 0; i < numWeights; i++) {
weightData[i] = ((rand() % 256) / 256.0f - 0.5f) * weightAmplitude;
}
clEnqueueWriteBuffer(RNN::clQueue, weightMem, CL_TRUE, 0, sizeof(float) * numWeights, weightData, 0, NULL, NULL);
connections.push_back(&other);
weightsMem.push_back(weightMem);
}
OpenCL可能会为CPU而不是活动设备分配内存的原因是什么?如何强制在GPU上分配内存?
编辑:一个简单的测试产生了这个内存带宽值,这与CPU和GPU之间建议的5-6 GB / s带宽一致。
operating device name: GeForce GTX 960M
2.09715 seconds
1.00663e+10 bytes
4.8e+09 bytes / second
Press any key to continue . . .