正确的方法来设置和拆除在一个测试套件的OpenCL的单元测试?(Correct way to set

2019-10-28 12:46发布

快速注:我使用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会BARF了CL_MEM_OBJECT_ALLOCATION_FAILURE。 我修改上面的代码,以便拆卸充分注释出来,并让安装程序不会重新创建任何新的clContexts或commandQueues,现在我没有得到任何CL_MEM_OBJECT_ALLOCATION_FAILURE错误,不管我有多少的测试运行。 我不知道如何成功地重置在这一点上我的显卡的状态,我失去的东西或做错了什么? 请让我知道,谢谢。

Answer 1:

也许它在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();
        }
    }
}


文章来源: Correct way to setup and tear down an openCL unit test in a test suite?