我正在使用 C++ 和 OpenCL 上的(循环)神经网络来获得一些深度学习的低级经验。现在我有一个简单的前向传播内核,它产生了奇怪的低性能;该设置与大多数深度学习设置一样受到内存限制,并且基于一些粗略的分析,我得到的内存带宽约为 2 GB/s。调用 clGetDeviceInfo() 确认我正在使用我的板载 GPU (GTX 960m);我怀疑我用 clCreateBuffer() 分配的内存不知何故最终落在了 CPU 上,这会导致传输速率徘徊在 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 . . .