clCreateBuffer()在CPU上分配?

时间:2016-11-25 19:29:46

标签: c++ memory opencl gpu memory-bandwidth

我正在使用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 . . .

0 个答案:

没有答案