我想运行一个并行的 for 循环来初始化一个带有随机值的二维缓冲区。但是我在内核的第一行得到一个 EXC_BAD_ACCESS (code=EXC_I386_GPFLT) 异常。
这是代码(Pixel 结构来自 PixelGameEngine 库):
namespace olc
{
struct Pixel
{
union
{
uint32_t n = nDefaultPixel;
struct
{
uint8_t r;
uint8_t g;
uint8_t b;
uint8_t a;
};
};
enum Mode
{
NORMAL, MASK, ALPHA, CUSTOM
};
Pixel()
{
r = 0;
g = 0;
b = 0;
a = nDefaultAlpha;
}
Pixel(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha = nDefaultAlpha)
{
n = red | (green << 8) | (blue << 16) | (alpha << 24);
}
Pixel(uint32_t p) { n = p; }
};
}
int main()
{
auto* screenBuffer = new olc::Pixel[256 * 240];
cl::sycl::queue queue;
{
cl::sycl::buffer<olc::Pixel, 2> b_screenBuffer(screenBuffer,
cl::sycl::range<2>(256, 240));
queue.submit([&](cl::sycl::handler& cgh) {
auto screenBuffer_acc = b_screenBuffer.get_access<cl::sycl::access::mode::write>(cgh);
cgh.parallel_for(cl::sycl::range<2>(256, 240), [&](cl::sycl::id<2> index) {
screenBuffer_acc[index] = olc::Pixel(rand() % 256, //Here I get the exception
rand() % 256,
rand() % 256);
});
});
}
return 0;
}
我在 Mac OS Catalina 上使用 triSYCL 0.1.0 和 boost 1.74 和 C++20。我试图将缓冲区的数据类型从 old::Pixel 更改为 float 并使缓冲区一维,但我总是遇到同样的异常。有人知道我可以尝试什么吗?