Tôi muốn đọc một vị trí bộ nhớ mà không gây ô nhiễm bộ nhớ cache. Tôi đang làm việc trên máy X86 Linux. Tôi đã thử sử dụng hướng dẫn lắp ráp MOVNTDQA:Làm cách nào để tải các giá trị từ bộ nhớ mà không làm ô nhiễm bộ đệm ẩn?
asm("movntdqa %[source], %[dest] \n\t"
: [dest] "=x" (my_var) : [source] "m" (my_mem[0]) : "memory");
my_mem là một int * được phân bổ với new, my_var là một int.
Tôi có hai vấn đề với cách tiếp cận này:
- mã biên dịch nhưng tôi nhận được "Chỉ thị bất hợp pháp" báo lỗi khi chạy nó. Bất kỳ ý tưởng tại sao?
- Tôi không chắc chắn loại bộ nhớ nào được cấp phát mới. Tôi cho rằng WB. Theo tài liệu, lệnh MOVNTDQA sẽ chỉ hoạt động với loại bộ nhớ USWC. Làm thế nào tôi có thể biết tôi đang làm việc với loại bộ nhớ nào?
Để tóm tắt, câu hỏi của tôi là:
Làm thế nào tôi có thể đọc một vị trí bộ nhớ mà không làm ô nhiễm bộ nhớ cache trên một máy X86? Cách tiếp cận của tôi có đúng hướng không và nó có thể được cố định để làm việc không?
Cảm ơn.
Câu hỏi này có liên quan không? http: // stackoverflow.com/questions/851286/how-to-use-movntdqa-to-avoid-cache-ô nhiễm – sharptooth
Tôi đoán nó liên quan :), nhưng không may, câu hỏi/câu trả lời đó không giúp tôi với câu hỏi này. – Anna
Ồ, một điều nữa: Tôi không chắc chắn rằng nó thậm chí có thể làm điều này: -/Tôi chắc chắn hy vọng nó được. – Anna