Краткое примечание: я использую JOCL и Java для разработки openCL. Я думаю, что вызовы openCL, которые мне нужны, будут такими же, как если бы я просто использовал C или C ++.
Моя проблема в том, что я хочу иметь возможность запускать каждый из моих тестов, как если бы это было первое, что запускает графический процессор после инициализации. Вот мой код:
protected cl_context clContext;
protected cl_command_queue commandQueue;
@Before
public void setUp() {
clContext = createContext();
cl_device_id devices[] = getGPUDevices(clContext);
commandQueue = clCreateCommandQueue(clContext, devices[0], 0, null);
CL.setExceptionsEnabled(true);
}
@After
public void tearDown() {
clReleaseCommandQueue(commandQueue);
clReleaseContext(clContext);
}
private cl_device_id[] getGPUDevices(cl_context clContext) {
cl_device_id devices[];
// Get the list of GPU devices associated with the context
long numBytes[] = new long[1];
clGetContextInfo(clContext, CL.CL_CONTEXT_DEVICES, 0, null, numBytes);
// Obtain the cl_device_id for the first device
int numDevices = (int) numBytes[0] / Sizeof.cl_device_id;
devices = new cl_device_id[numDevices];
clGetContextInfo(clContext, CL_CONTEXT_DEVICES, numBytes[0],
Pointer.to(devices), null);
return devices;
}
private cl_context createContext() {
cl_context clContext;
//System.out.println("Obtaining platform...");
cl_platform_id platforms[] = new cl_platform_id[1];
clGetPlatformIDs(platforms.length, platforms, null);
cl_context_properties contextProperties = new cl_context_properties();
contextProperties.addProperty(CL_CONTEXT_PLATFORM, platforms[0]);
// Create an OpenCL context on a GPU device
clContext = clCreateContextFromType(
contextProperties, CL_DEVICE_TYPE_GPU, null, null, null);
return clContext;
}
Этот код вызывает проблемы после запуска более 20 тестов. По какой-то причине openCL откажется от CL_MEM_OBJECT_ALLOCATION_FAILURE. Я изменил приведенный выше код, чтобы разметка была полностью закомментирована и чтобы программа установки не воссоздала какие-либо новые clContexts или commandQueues, и теперь я не получаю никаких ошибок CL_MEM_OBJECT_ALLOCATION_FAILURE, независимо от того, сколько тестов я выполняю. Я не уверен, как успешно сбросить состояние моей видеокарты на этом этапе, я что-то упустил или что-то не так? Пожалуйста, дайте мне знать, спасибо.