2012-02-17 37 views
8

Tôi đang viết một thuật toán trong OpenCL, trong đó tôi cần mọi đơn vị công việc để ghi nhớ một phần dữ liệu hợp lý, nói điều gì đó giữa long[70]long[200] hoặc hạt nhân.bộ nhớ vật lý trên các thiết bị AMD: cục bộ và riêng

Thiết bị AMD gần đây có 32 bộ nhớ KiB __local, tức là (cho số lượng dữ liệu nhất định cho mỗi hạt nhân) đủ để lưu trữ thông tin cho 20-58 đơn vị làm việc. Tuy nhiên, từ những gì tôi hiểu từ kiến ​​trúc (và đặc biệt là từ this drawing), mỗi lõi của trình đổ bóng cũng có một lượng bộ nhớ riêng. Tuy nhiên tôi không tìm thấy kích thước của nó.

Bất cứ ai có thể cho tôi biết làm thế nào để tìm ra bao nhiêu bộ nhớ riêng mỗi hạt nhân có?

Tôi đặc biệt tò mò về HD7970, vì tôi dự định mua một số trong số này sớm.

Edit: Giải quyết vấn đề, câu trả lời là here trong phụ lục D.

+2

Tôi không tin rằng bộ nhớ riêng được dành riêng cho mỗi lõi - nó ánh xạ tới tệp đăng ký, mỗi tài nguyên đơn vị tính toán. Mỗi mục công việc được đăng ký được cấp phát từ tệp đăng ký đơn vị tính toán, số lượng được yêu cầu xác định số lượng wavefront trong chuyến bay tại bất kỳ thời điểm nào đã cho. – talonmies

+0

Từ bản vẽ nổi tiếng khắp mọi nơi http://www.codeproject.com/KB/showcase/Memory-Spaces/image001.jpg Tôi kết luận rằng bộ nhớ riêng có thể chất khác với bộ nhớ __local, phải không? – user1111929

+2

Có, chúng khác nhau về thể chất. Bộ nhớ riêng ánh xạ tới tập tin đăng ký đơn vị tính toán, bộ nhớ cục bộ để tính bộ nhớ chia sẻ mức đơn vị trong hầu hết các thiết bị AMD hiện đại. Một vài GPU tương thích OpenCL sớm không có bộ nhớ chia sẻ chết và bộ nhớ cục bộ chỉ là SDRAM. Không phải là mỗi lõi và số lượng bạn sử dụng cho mỗi mục công việc cho nhóm riêng tư và mỗi nhóm làm việc cho các hiệu ứng cục bộ số lượng các wavefront đồng thời chạy trên mỗi đơn vị tính toán. – talonmies

Trả lời

4

Câu trả lời đã được đưa ra bởi người dùng tài năng trong các ý kiến, vì vậy tôi sẽ viết nó trong một câu trả lời mới ở đây để đóng câu hỏi.

Các giá trị này có thể được tìm thấy trong Phụ lục D của Hướng dẫn lập trình AMD APP OpenCL http://developer.amd.com/sdks/amdappsdk/assets/amd_accelerated_parallel_processing_opencl_programming_guide.pdf (tài liệu tương tự tồn tại cho nVidia). Rõ ràng một thanh ghi là 128 bit (4x32) cho các thiết bị AMD và có 16384 thanh ghi cho tất cả các thiết bị cao cấp hiện đại, vì vậy đó là một 256KB đáng kể cho mỗi đơn vị tính toán.

0

Tôi nghĩ rằng bạn đang tìm kiếm bộ nhớ __local. Đó là những gì 32KB lưu trữ dữ liệu cục bộ đang đề cập đến. Tôi không nghĩ rằng bạn có thể thăm dò ý kiến ​​thiết bị để có được số lượng bộ nhớ riêng.

Bạn có thể truyền tham số NULL * cl_mem dài để cấp phát bộ nhớ. Tôi nghĩ tốt nhất là sử dụng một lượng bộ nhớ tĩnh cho mỗi WI. Giả sử rằng dài [200] sẽ được yêu cầu cho mỗi mục công việc, bạn sẽ sử dụng mã dưới đây. Nó cũng sẽ là một ý tưởng tốt để chia công việc thành các nhóm có cùng yêu cầu bộ nhớ (hoặc tương tự), để tận dụng tối đa bộ nhớ LDS.

void __kernel(__local long* localMem, const int localMemPerItem 
     //more args... 
     ) 
{ 
    //host has 'passed' localMemPerItem*get_local_size() long values in as locamMem 
    //this work item has access to all of it, but can choose to restrict 
    //itself to only the portion it needs. 
    //work group size will be limited to CL_DEVICE_LOCAL_MEM_SIZE/(8*localMemPerItem) 
    int startIndex=localMemPerItem*get_local_id(0); 
    //use localMem[startIndex+ ... ] 
} 
+1

Bạn không thể thăm dò ý kiến, nhưng nó có tồn tại không? Từ bản vẽ nổi tiếng khắp mọi nơi http://www.codeproject.com/KB/showcase/Memory-Spaces/image001.jpg Tôi giả định rằng có một bộ đăng ký riêng biệt về mặt vật lý trên mỗi đơn vị công việc. Không? Tôi hy vọng bằng cách nào đó làm tốt hơn một giới hạn CL_DEVICE_LOCAL_MEM_SIZE/(8 * localMemPerItem), vì nó gần như lá một nửa của các lõi không sử dụng. Truy cập bộ nhớ toàn cầu có lẽ sẽ là quá chậm, mặc dù nó chỉ tăng thêm một bộ đếm. – user1111929

+1

Tôi tìm thấy một số thông tin thêm về kích thước đăng ký cây bách, cay và fermi tại đây: http://www.realworldtech.com/page.cfm?ArticleID=RWT121410213827&p=11 Bạn sẽ có thể tinh chỉnh một số lọ riêng tư có kích thước phù hợp với kích thước đó . Tôi nghĩ rằng LDS vẫn sẽ là đặt cược tốt nhất của bạn mặc dù. – mfa

0

Để trả lời như thế nào lớn là đăng ký tập tin trong thẻ loạt 79xx, vì nó dựa trên kiến ​​trúc GCN nó là 64KB theo hình ảnh trong Anandtech: http://www.anandtech.com/print/5261

Để trả lời câu hỏi của bạn làm thế nào để tìm hiểu cách thức nhiều bộ nhớ mỗi hạt nhân sử dụng .. bạn có thể xem chạy AMD APP Profiler trên hạt nhân của bạn, nó cho bạn biết trong phần dung lượng hạt nhân bao nhiêu không gian được sử dụng bởi hạt nhân.

+0

Oh thực sự? Lạ nhỉ. Tôi nghĩ đã tìm ra câu trả lời, nhưng đó là một câu trả lời khác. Trong hướng dẫn lập trình AMD OpenCL http://developer.amd.com/sdks/amdappsdk/assets/amd_accelerated_parallel_processing_opencl_programming_guide.pdf trong Phụ lục D, có tổng kích thước tệp đăng ký và được liệt kê là 256 KB cho tất cả các thiết bị hiện đại. Điều gì là đúng bây giờ? : S – user1111929

+0

Tôi tin rằng cả hai đều chính xác. Theo tôi hiểu nó, Trong kiến ​​trúc GCN, một đơn vị SIMD có 64kb tệp đăng ký và có 4 đơn vị SIMD trên mỗi đơn vị tính toán, nghĩa là. 4 * 64kb = 256kb tổng số tệp đăng ký trên mỗi đơn vị tính toán. – talonmies

Các vấn đề liên quan