2012-09-17 22 views
5

tôi có:Tốt hơn hoặc giống nhau: CPU memcpy() vs device cudaMemcpy() trên pinned, bộ nhớ được ánh xạ trong CUDA?

    nhớ
  • Host đã được ghim thành công và lập bản đồ sử dụng cudaHostAlloc(..., cudaHostAllocMapped) hoặc cudaHostRegister(..., cudaHostRegisterMapped);
  • Con trỏ thiết bị đã được lấy bằng cách sử dụng cudaHostGetDevicePointer(...).

Tôi bắt đầu cudaMemcpy(..., cudaMemcpyDeviceToDevice) trên src và dest device con trỏ trỏ đến hai vùng khác nhau của bộ nhớ được ánh xạ + được lấy bởi kỹ thuật ở trên. Mọi thứ đều hoạt động tốt.

Câu hỏi: Tôi có nên tiếp tục thực hiện việc này hay chỉ sử dụng kiểu CPU memcpy() theo kiểu truyền thống vì mọi thứ đều nằm trong bộ nhớ hệ thống? ... hoặc có phải là số cùng một số (ví dụ: cudaMemcpy ánh xạ đến thẳng memcpy khi cả hai src và dest được ghim)?

(tôi vẫn đang sử dụng phương pháp cudaMemcpy vì trước đây tất cả mọi thứ là trong ký ức toàn cầu thiết bị, nhưng có kể từ khi chuyển sang bộ nhớ gắn do hạn chế về kích thước gmem)

+1

Đó là một câu hỏi thú vị. Với điều kiện bạn sử dụng một memcpy tối ưu, CPU có lẽ tốt hơn - bộ nhớ thuộc về nó, sau khi tất cả - và khả năng của một GPU rời rạc để làm host-> host memcpy bị giới hạn băng thông PCIe. Nhưng nếu GPU không hoạt động, tại sao không? – ArchaeaSoftware

+0

Tôi hy vọng GPU sẽ không làm bản sao. Tôi hy vọng thời gian chạy sẽ thấy rằng các con trỏ là cả hai con trỏ lưu trữ và gọi một máy chủ memcpy. Tôi đã yêu cầu để tìm hiểu những gì thực sự xảy ra. – harrism

Trả lời

3

Với cudaMemcpy trình điều khiển CUDA phát hiện rằng bạn đang sao chép từ một con trỏ lưu trữ sang con trỏ máy chủ và bản sao được thực hiện trên CPU. Bạn có thể sử dụng memcpy trên CPU chính mình nếu bạn thích.

Nếu bạn sử dụng cudaMemcpy, có thể có một luồng bổ sung được đồng bộ hóa trước khi thực hiện bản sao (bạn có thể thấy trong hồ sơ, nhưng tôi đoán có kiểm tra và xem) —.

Trên hệ thống UVA, bạn chỉ có thể sử dụng cudaMemcpyDefault làm câu trả lời cho biết trong câu trả lời của mình. Nhưng nếu bạn không có UVA (sm_20 + và hệ điều hành 64 bit), thì bạn phải gọi đúng bản sao (ví dụ: cudaMemcpyDeviceToDevice). Nếu bạn cudaHostRegister() tất cả mọi thứ bạn quan tâm sau đó cudaMemcpyDeviceToDevice sẽ kết thúc làm những điều sau đây tùy thuộc vào nơi bộ nhớ tọa lạc:

  • chủ < -> Máy chủ: thực hiện bởi CPU (memcpy)
  • chủ < - > thiết bị: DMA (thiết bị cơ bản)
  • Device < -> Device: memcpy CUDA hạt nhân (chạy trên các tin nhắn SMS, đưa ra bởi lái xe)
+0

rất interestig, bạn có một số nguồn mà bạn tìm thấy các infos? –

+0

Tôi tin rằng tôi đã hỏi đồng nghiệp NVIDIA của tôi để biết chi tiết triển khai. – harrism

2

Nếu bạn đang làm việc trên một nền tảng với UVA (thống nhất địa chỉ ảo), tôi thực sự khuyên bạn nên sử dụng cudaMemcpy với cudaMemcpyDefault. Bằng cách đó, tất cả điều này trao đổi về đường dẫn nhanh nhất sẽ trở thành chi tiết triển khai API nội bộ mà bạn không phải lo lắng.

+0

Có và không, tôi thường làm việc trên C1060 nhưng có quyền truy cập C2050/70. Vì vậy, những gì về liên quan đến câu hỏi bộ nhớ pinned của tôi cụ thể - bạn có biết những gì 'cudaMemcpyDefault' làm đằng sau hậu trường trong trường hợp này?Điều đó sẽ trả lời câu hỏi khá nhiều. – schmichael

+0

Tôi không làm việc.cho NVIDIA vì vậy tôi đã không nhìn thấy bất kỳ mã nào, nhưng nó xuất hiện nhìn vào các con trỏ nguồn và đích và theo đó. Bạn sẽ nhận được một bản sao phía máy chủ lưu trữ với một con trỏ máy chủ và một thiết bị để sao chép thiết bị với một con trỏ thiết bị – talonmies

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