Tôi đang viết một chương trình trong C cần thực hiện một số phép tính toán nhanh. Tôi đang sử dụng hướng dẫn lắp ráp SSE nội tuyến để có được một số hành động SIMD (sử dụng số điểm nổi chính xác gấp đôi được đóng gói). Tôi đang biên dịch bằng GCC trên Linux.Nhận GCC để duy trì thanh ghi SSE trong suốt một hàm sử dụng nội tuyến asm
Tôi đang trong tình huống cần phải lặp qua một số dữ liệu và tôi sử dụng yếu tố không đổi trong các phép tính của mình. Tôi muốn giữ yếu tố đó được giấu trong một thanh ghi an toàn trong vòng lặp, vì vậy tôi không phải nạp lại nó mỗi lần.
Để làm rõ với một số mã:
struct vect2 {
fltpt x;
fltpt y;
}__attribute__((aligned(16))); /* Align on 16B boundary for SSE2 instructions */
typedef struct vect2 vect2_t;
void function()
{
/* get a specific value set up in xmm1, and keep it there for the
* rest of the loop. */
for(int i = 0, i<N; i++){
asm(
"Some calculations;"
"on an element of;"
"a data set.;"
"The value in xmm1;"
"is needed;"
);
}
}
Tôi đã cố gắng làm điều gì đó với "đăng ký" từ khóa. Nhưng nếu tôi không nhầm, có vẻ như tôi chỉ có thể giữ một con trỏ cho cấu trúc đó (trong sổ đăng ký chung). Điều này sẽ cần phải được trì hoãn mỗi lần lặp lại, lãng phí thời gian quý báu.
register vect2_t hVect asm("xmm1") = {h, h};
/* Gives error: data type of 'hVect' isn't suitable for a register */
register vect2_t *hVect2 asm("rax");
*hVect2 = (vect2_t){h,h};
/* Seems to work, but not what I'm looking for */
Tôi không thích giả định rằng GCC sẽ không thay đổi sổ đăng ký xmm1, nó quá nhiều của một "ác quỷ bay ra khỏi mũi" loại điều :-). Vì vậy, tôi hy vọng có một cách thích hợp để làm điều này.