У меня есть два графических процессора, одно ядро, один контекст и две очереди команд (по 1 на каждый графический процессор). Я попытался запустить их в цикле, где запущена каждая очередь команд, а затем я попробовал как queue.finish()
, так и queue.flush()
в надежде запустить работу на графических процессорах одновременно.Как запустить OpenCL на нескольких графических процессорах (2) одновременно?
Но на самом деле происходит то, что данные сначала отправляются на одно устройство, а GPU выполняет свою работу, а затем другой графический процессор начинает работать. Это занимает в два раза больше времени, чем на одном графическом процессоре. Это не то, что я намереваюсь достичь!
Хотя я также читаю буферы обратно в код хоста, и можно подумать, что это может быть проблемой для второго GPU, ожидающего результата 1го. Но я также прокомментировал результаты чтения без ведома. Его все равно то же самое.
for (unsigned int iter = 0; iter < numberOfDevices; iter++) {
// Load in kernel source, creating a program object for the context
cl::Program programGA(context, stringifiedSourceCL, true);
// Create the kernel functor
auto kernelGA = cl::make_kernel<cl::Buffer,
cl::Buffer,
cl::Buffer>
(programGA, "kernelGA");
// CREATE THE BUFFERS.
d_pop = cl::Buffer(context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR,
(Length * POP_SIZE * sizeof(double)),
pop);
// And other buffers...
// Enqueue the kernel.
kernelGA(cl::EnqueueArgs(queue[iter],
cl::NDRange(POP_SIZE/numberOfDevices)),
d_integerParameters,
d_doubleParameters, ... and so on...);
// Enqueue in the corresponding device.
queue[iter].flush();
// Get results from the queue.
queue[iter].enqueueReadBuffer(buf_half_population,
true,
0,
popSizeMD * sizeof(double),
popMD[iter]);
// Add up the results after every iteration.
for (int in_iter = 0; in_iter < populationSizeMD; in_iter++, it_j++) {
population[it_j] = populationMD[iter][in_iter];
}
}
Мой вопрос: Что я должен сделать для того чтобы достигнуть истинного Параллелизм и делают графические процессоры работают одновременно, не дожидаясь результата другого? Должен ли я создать два контекста? Должен ли я делать что-то еще?
Имея в виду, что существует одно ядро