Я работаю с (текущей) нейронной сетью на C ++ & OpenCL, чтобы получить некоторый опыт низкого уровня с глубоким обучением. Прямо сейчас у меня есть простое ядро прямого распространения, которое дает странно низкую производительность; установка ограничена памятью, как и большинство настроек глубокого обучения, и основана на некотором грубом профилировании пропускной способности памяти, которую я получаю, около 2 ГБ / с. Вызов clGetDeviceInfo () подтверждает, что я использую мой встроенный графический процессор (GTX 960m); Я подозреваю, что каким-то образом память, которую я выделяю с помощью clCreateBuffer (), каким-то образом оказывается на процессоре, что приводит к тому, что скорость передачи данных колеблется около 2 ГБ / с, как это было предложено Эта статья. Буферы, которые я выделяю, не должны быть слишком большими для GPU; самые большие — 1024 * 1024 * 4 байта = 4 МБ (веса), и только 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 может выделять память ЦП вместо активного устройства? Что я могу сделать, чтобы принудительно выделить память на GPU?
РЕДАКТИРОВАТЬ: простой тест дал это значение для пропускной способности памяти, которая соответствует предложенной пропускной способности 5-6 ГБ / с между процессором и графическим процессором.
operating device name: GeForce GTX 960M
2.09715 seconds
1.00663e+10 bytes
4.8e+09 bytes / second
Press any key to continue . . .
Задача ещё не решена.
Других решений пока нет …