OpenCL Intel Iris集成图形退出时出现中止陷阱6:超时问题

OpenCL Intel Iris集成图形退出时出现中止陷阱6:超时问题,opencl,intel,montecarlo,exp,random-walk,Opencl,Intel,Montecarlo,Exp,Random Walk,我正试图编写一个程序,使用OpenCL执行蒙特卡罗模拟。我遇到了一个涉及指数的问题。当变量steps的值变大(约20000)时,指数的计算意外失败,程序退出“中止陷阱:6”。这似乎是一个奇怪的错误,因为步骤不应该影响内存分配。我已尝试将正常值、α值和β值设置为0,但这并不能解决问题,但注释出指数并用常数1替换它似乎可以解决问题。我已经在AWS GPU实例上运行了我的代码,它没有遇到任何问题。有人知道为什么集成显卡会出现问题吗 解决方案 在较小的范围内多次执行内核,以使内核执行时间保持在5秒以下

我正试图编写一个程序,使用OpenCL执行蒙特卡罗模拟。我遇到了一个涉及指数的问题。当变量steps的值变大(约20000)时,指数的计算意外失败,程序退出“中止陷阱:6”。这似乎是一个奇怪的错误,因为步骤不应该影响内存分配。我已尝试将正常值α值β值设置为0,但这并不能解决问题,但注释出指数并用常数1替换它似乎可以解决问题。我已经在AWS GPU实例上运行了我的代码,它没有遇到任何问题。有人知道为什么集成显卡会出现问题吗

解决方案

在较小的范围内多次执行内核,以使内核执行时间保持在5秒以下

代码片段

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

static uint MWC64X(uint2 *state) {
  enum { A = 4294883355U };
  uint x = (*state).x, c = (*state).y; 
  uint res = x ^ c;                    
  uint hi = mul_hi(x, A);              
  x = x * A + c;
  c = hi + (x < c);
  *state = (uint2)(x, c); 
  return res;          
}

__kernel void discreteMonteCarloKernel(...) {

  float cumulativeWalk = stockPrice;
  float currentValue = stockPrice;

  ...

  uint n = get_global_id(0);
  uint2 seed2 = (uint2)(n, seed);
  uint random1 = MWC64X(&seed2);
  uint2 seed3 = (uint2)(random1, seed);
  uint random2 = MWC64X(&seed3);

  float alpha = (interestRate - 0.5 * sigma * sigma) * dt;
  float beta = sigma * sqrt(dt);

  float u1;
  float u2;
  float a;
  float b;
  float normal;

  for (int j = 0; j < steps; j++) {

    random1 = MWC64X(&seed2);

    if (random1 == 0) {
      random1 = MWC64X(&seed2);
    }

    random2 = MWC64X(&seed3);

    u1 = (float)random1 / (float)0xffffffff;
    u2 = (float)random2 / (float)0xffffffff;

    a = sqrt(-2 * log(u1));
    b = 2 * M_PI * u2;

    normal = a * sin(b);

    exponent = exp(alpha + beta * normal);
    currentValue = currentValue * exponent;
    cumulativeWalk += currentValue;

    ...
}
Exception Type:        EXC_CRASH (SIGABRT)
Exception Codes:       0x0000000000000000, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Application Specific Information:
abort() called

Application Specific Signatures:
Graphics hardware encountered an error and was reset: 0x00000813


Thread 0 Crashed:: Dispatch queue: opencl_runtime
0   libsystem_kernel.dylib          0x00007fffb14bad42 __pthread_kill + 10
1   libsystem_pthread.dylib         0x00007fffb15a85bf pthread_kill + 90
2   libsystem_c.dylib               0x00007fffb1420420 abort + 129
3   libGPUSupportMercury.dylib      0x00007fffa98e6fbf gpusGenerateCrashLog + 158
4   com.apple.driver.AppleIntelHD5000GraphicsGLDriver   0x000000010915f13b gpusKillClientExt + 9
5   libGPUSupportMercury.dylib      0x00007fffa98e7983 gpusQueueSubmitDataBuffers + 168
6   com.apple.driver.AppleIntelHD5000GraphicsGLDriver   0x00000001091aa031 IntelCLCommandBuffer::getNew(GLDQueueRec*) + 31
7   com.apple.driver.AppleIntelHD5000GraphicsGLDriver   0x00000001091a9f99 intelSubmitCLCommands(GLDQueueRec*, unsigned int) + 65
8   com.apple.driver.AppleIntelHD5000GraphicsGLDriver   0x00000001091b00a1 CHAL_INTEL::ChalContext::ChalFlush() + 83
9   com.apple.driver.AppleIntelHD5000GraphicsGLDriver   0x00000001091aa2c3 gldFinishQueue + 43
10  com.apple.opencl                0x00007fff9ffeeb37 0x7fff9ffed000 + 6967
11  com.apple.opencl                0x00007fff9ffef000 0x7fff9ffed000 + 8192
12  com.apple.opencl                0x00007fffa000ccca 0x7fff9ffed000 + 130250
13  com.apple.opencl                0x00007fffa001029d 0x7fff9ffed000 + 144029
14  libdispatch.dylib               0x00007fffb13568fc _dispatch_client_callout + 8
15  libdispatch.dylib               0x00007fffb1357536 _dispatch_barrier_sync_f_invoke + 83
16  com.apple.opencl                0x00007fffa001011d 0x7fff9ffed000 + 143645
17  com.apple.opencl                0x00007fffa000bda6 0x7fff9ffed000 + 126374
18  com.apple.opencl                0x00007fffa00011df clEnqueueReadBuffer + 813
19  simplisticComparison            0x0000000107b953cf BinomialMultiplication::execute(int) + 1791
20  simplisticComparison            0x0000000107b9ec7f main + 767
21  libdyld.dylib                   0x00007fffb138c235 start + 1

Thread 1:
0   libsystem_pthread.dylib         0x00007fffb15a50e4 start_wqthread + 0
1   ???                             0x000070000eed6b30 0 + 123145552751408

Thread 2:
0   libsystem_pthread.dylib         0x00007fffb15a50e4 start_wqthread + 0

Thread 3:
0   libsystem_pthread.dylib         0x00007fffb15a50e4 start_wqthread + 0
1   ???                             0x007865646e496d65 0 + 33888479226719589

Thread 0 crashed with X86 Thread State (64-bit):
  rax: 0x0000000000000000  rbx: 0x0000000000000006  rcx: 0x00007fff58074078  rdx: 0x0000000000000000
  rdi: 0x0000000000000307  rsi: 0x0000000000000006  rbp: 0x00007fff580740a0  rsp: 0x00007fff58074078
   r8: 0x0000000000000000   r9: 0x00007fffb140ba50  r10: 0x0000000008000000  r11: 0x0000000000000206
  r12: 0x00007f92de80a7e0  r13: 0x00007f92e0008c00  r14: 0x00007fffba29e3c0  r15: 0x00007f92de801a00
  rip: 0x00007fffb14bad42  rfl: 0x0000000000000206  cr2: 0x00007fffba280128

Logical CPU:     0
Error Code:      0x02000148
Trap Number:     133

我猜。驾驶员可以通过两种方式撞车:

  • 我们引用了一个错误的缓冲区地址。这可能不是你的情况
  • 我们超时(超过TDR)。内核有几秒钟的时间来完成
  • 我的钱在2英镑上。如果较大的值(步数)使GPU运行时间过长,系统将停止运行

    我不熟悉苹果的英特尔驱动程序,但通常有一种方法可以在极端情况下禁用TDR。例如,参见TDRs上的,以获取要点。(Linux驱动程序也有办法禁用此功能。)


    通常情况下,我们希望避免运行需要超长时间的事情,以某种方式分解工作负载可能是一个好主意,这样您自然就不会碰到这种终止开关。例如,可能将“步骤”分为更小的块(传入并保存无法重新计算的部分的状态)。

    这是哪个/谁的OpenCL实现?看起来像是英特尔HD5000(从堆栈跟踪中)它是在英特尔HD5000(Iris)上运行的OpenCL 1.2我已经从各个角度查看了内存,所以我同意我强烈怀疑驱动程序是否因为缓冲区地址不正确而崩溃。我注意到,随着蒙特卡罗模拟次数的减少,它能够执行的步骤也随之增加。我决定在内核执行周围放置一个计时器,有证据表明有5秒的超时。非常感谢你的帮助!