2011-05-16 27 views
11

Tôi có một vectơ cột A dài 10 phần tử. Tôi có một ma trận B là 10 của 10. Bộ nhớ lưu trữ cho B là cột chính. Tôi muốn ghi đè lên hàng đầu tiên trong B với vectơ cột A.Có phiên bản memcpy tiêu chuẩn, có cấu trúc không?

Rõ ràng, tôi có thể làm:

for (int i=0; i < 10; i++) 
{ 
    B[0 + 10 * i] = A[i]; 
} 

nơi tôi đã rời khỏi zero trong 0 + 10 * i để nhấn mạnh rằng B sử dụng cột lưu trữ lớn (số không là chỉ mục hàng).

Sau một số tai nạn ở đất CUDA tối nay, tôi đã nghĩ rằng có thể có một chức năng CPU để thực hiện một memcpy strided? Tôi đoán ở một mức độ thấp, hiệu suất sẽ phụ thuộc vào sự tồn tại của một hướng dẫn tải/lưu trữ strided, mà tôi không nhớ có được trong lắp ráp x86?

+0

có thể bạn nên xem xét chuyển đổi chiến lược lưu trữ cho ma trận này hoặc lưu trữ chuyển vị của nó. –

Trả lời

8

Câu trả lời ngắn: Mã bạn đã viết nhanh như nó sẽ nhận được.

Câu trả lời dài: Hàm memcpy được viết bằng cách sử dụng một số nội tại hoặc lắp ráp phức tạp bởi vì nó hoạt động trên các toán hạng bộ nhớ có kích thước tùy ý và căn chỉnh. Nếu bạn đang ghi đè lên một cột của một ma trận, thì toán hạng của bạn sẽ có sự liên kết tự nhiên, và bạn sẽ không cần phải dùng đến các thủ thuật tương tự để có được tốc độ tốt.

+0

Tôi đoán tôi chỉ có hy vọng truy cập cấp độ lắp ráp để nói 'hướng dẫn tải/lưu trữ không có cấu trúc cho bộ nhớ kênh đôi và ba kênh. –

+0

Tôi không chắc chắn ý bạn là gì bởi các hoạt động tải/lưu trữ 'không có cấu trúc'. –

+0

Có lẽ chỉ là một nhận thức sai về phần của tôi, nhưng tôi nghĩ rằng ram kênh ba đã được sọc thông qua không gian địa chỉ? Nếu tôi có thể ghi vào một trong những chip bộ nhớ (chỉ viết trong một kênh ở tốc độ chậm hơn) thì nó có thể tương đương với một memcpy được quét? Điều này tất nhiên sẽ phụ thuộc mạnh vào độ chi tiết của dải phân cách. –