Có vẻ như 2 triệu phao không phải là vấn đề lớn, chỉ có 8MB RAM 1 GB. Tôi có thể phân bổ nhiều lần và đôi khi nhiều hơn thế mà không gặp rắc rối. Tôi nhận được CL_OUT_OF_RESOURCES khi tôi làm một clEnqueueReadBuffer, mà có vẻ kỳ lạ. Tôi có thể phát hiện ra nơi gặp rắc rối thực sự bắt đầu không? OpenCL không nên thất bại như thế này tại clEnqueueReadBuffer phải không? Nó nên được khi tôi phân bổ các dữ liệu phải không? Có cách nào để biết thêm chi tiết hơn chỉ là mã lỗi không? Nó sẽ được mát mẻ nếu tôi có thể xem có bao nhiêu VRAM đã được phân bổ khi OpenCL tuyên bố CL_OUT_OF_RESOURCES.CL_OUT_OF_RESOURCES cho 2 triệu float với VRAM 1GB?
Trả lời
Không phải tất cả bộ nhớ có sẵn có thể nhất thiết phải được cung cấp cho một yêu cầu chuyển đổi duy nhất. Đọc thêm về phân mảnh đống 1, 2, 3 để tìm hiểu thêm về lý do tại sao phân bổ lớn nhất có thể thành công là khối bộ nhớ tiếp giáp lớn nhất và cách khối được chia thành các phần nhỏ hơn do sử dụng bộ nhớ.
Nó không phải là tài nguyên bị cạn kiệt ... Nó chỉ có thể không tìm thấy một mảnh duy nhất đủ lớn để đáp ứng yêu cầu của bạn ...
Từ another source:
- gọi clFinish() giúp bạn lỗi trạng thái để tính toán (thay vì nhận được nó khi bạn cố đọc dữ liệu).
- lỗi "ngoài tài nguyên" cũng có thể do thời gian chờ 5 giây nếu thẻ (NVidia) cũng được sử dụng làm màn hình
- cũng có thể xuất hiện khi bạn gặp lỗi con trỏ trong hạt nhân.
Theo dõi đề xuất chạy hạt nhân trước trên CPU để đảm bảo bạn không truy cập bộ nhớ ngoài giới hạn.
Tôi vừa gặp vấn đề tương tự với bạn (đã đưa tôi cả ngày để sửa). Tôi chắc rằng những người có cùng vấn đề sẽ gặp phải vấn đề này, đó là lý do tại sao tôi đăng câu hỏi cũ này.
Bạn có thể không kiểm tra kích thước nhóm làm việc tối đa của hạt nhân.
Đây là cách bạn làm điều đó:
size_t kernel_work_group_size;
clGetKernelWorkGroupInfo(kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &kernel_work_group_size, NULL);
thiết bị của tôi (2x NVIDIA GTX 460 & Intel CPU i7) hỗ trợ kích thước nhóm làm việc tối đa 1024, nhưng mã trên trả về một cái gì đó khoảng 500 khi tôi vượt qua của tôi Path Tracing hạt nhân. Khi tôi sử dụng kích thước nhóm làm việc 1024 nó rõ ràng là không thành công và đã cho tôi lỗi CL_OUT_OF_RESOURCES.
Hạt nhân càng phức tạp, kích thước nhóm làm việc tối đa càng nhỏ (hoặc ít nhất là điều tôi đã trải qua).
Edit:
Tôi chỉ nhận ra bạn nói "clEnqueueReadBuffer" thay vì "clEnqueueNDRangeKernel" ...
câu trả lời của tôi đã liên quan đến clEnqueueNDRangeKernel.
Xin lỗi vì đã nhầm lẫn.
Tôi hy vọng điều này vẫn hữu ích cho người khác.
Vượt giới hạn trong các hạt nhân thường là im lặng (do vẫn không có lỗi tại cuộc gọi xếp hàng hạt nhân).
Tuy nhiên, nếu bạn cố gắng đọc kết quả hạt nhân sau với một clEnqueueReadBuffer(). Lỗi này sẽ hiển thị. Nó chỉ ra một cái gì đó đã đi sai trong khi thực hiện hạt nhân.
Kiểm tra mã hạt nhân của bạn để đọc/ghi vượt quá giới hạn.
Điều này có ý nghĩa, cảm ơn bạn đã chỉ ra. Có cách nào để phân tích những gì các mảnh vỡ của bộ nhớ heap trông giống như trên GPU khi thất bại xảy ra? – smuggledPancakes
Có thể gDEBbugger? http://www.gremedy.com/ Tôi chưa bao giờ sử dụng nó. –
Bằng cách nào đó tôi nghi ngờ thats thực sự là vấn đề, vì bộ nhớ gpu nên thường không được phân mảnh đủ cho điều đó. Afterall 8MB không thực sự là nhiều trên một thẻ 1GB (exspecially kể từ khi trình điều khiển sẽ có thể kéo bộ nhớ hiện chưa sử dụng để mainmemory) và phân bổ bộ nhớ gpu thường tương đối chunky. Vì vậy, có vẻ như bạn phải gần với giới hạn bộ nhớ nếu bạn thấy các vấn đề như vậy do phân mảnh dù sao và nếu đó là một hệ thống dựa trên thẻ thông thường (ngược lại với tesla) tôi nghi ngờ người lái xe sẽ không can thiệp vào thời điểm đó (bằng cách giết một số ngữ cảnh). – Grizzly