gpt4 book ai didi

java - 在测试套件中设置和拆除 openCL 单元测试的正确方法?

转载 作者:行者123 更新时间:2023-12-01 15:56:57 24 4
gpt4 key购买 nike

快速说明:我使用 JOCL 和 Java 进行 openCL 开发。我认为我需要的 openCL 调用与我仅使用 C 或 C++ 相同。

我的问题是,我希望能够运行每个测试,就好像它是 GPU 初始化后运行的第一件事一样。这是我的代码:

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 错误。我现在不确定如何成功重置显卡的状态,我是否遗漏了什么或做错了什么?请告知,谢谢。

最佳答案

也许这是 JOCL.org 中的一个错误?我只是在一些机器上运行了一些负载测试 http://jocl.jogamp.org并且无法重现该问题。

@org.junit.Test
public void test(){
for (int i = 0; i < 100000; i++) {
CLContext context = CLContext.create();
try{
CLCommandQueue queue = context.getDevices()[0].createCommandQueue();
queue.release();
}finally{
context.release();
}
}
}

关于java - 在测试套件中设置和拆除 openCL 单元测试的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4879642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com