Việc thực hiện (simd) của tôi mất nhiều thời gian, mặc dù nó được chạy cho đầu vào cố định. Thời gian chạy thay đổi giữa khoảng 100 triệu chu kỳ đồng hồ đến 120 triệu chu kỳ đồng hồ. Chương trình gọi một hàm khoảng 600 lần, và phần đắt nhất của hàm là bộ nhớ được truy cập ~ 2000 lần. Do đó, sự tham gia của bộ nhớ tổng thể khá cao trong chương trình của tôi.Thời gian chạy biến của chương trình C
Biến thể trong thời gian chạy do các mẫu truy cập bộ nhớ/nội dung bộ nhớ ban đầu?
Tôi đã sử dụng valgrind để phân tích hồ sơ chương trình của mình. Nó cho thấy mỗi truy cập bộ nhớ mất khoảng 8 hướng dẫn. Điều này có bình thường không?
Sau đây là đoạn mã (hàm) được gọi là 600 lần. Mulprev [32] [20] là mảng được truy cập nhiều lần nhất.
j = 15;
u3v = _mm_set_epi64x (0xF, 0xF);
while (j + 1)
{
l = j << 2;
for (i = 0; i < 20; i++)
{
val1v = _mm_load_si128 ((__m128i *) &elm1v[i]);
uv = _mm_and_si128 (_mm_srli_epi64 (val1v, l), u3v);
u1 = _mm_extract_epi16 (uv, 0);
u2 = _mm_extract_epi16 (uv, 4) + 16;
for (ival = i, ival1 = i + 1, k = 0; k < 20; k += 2, ival += 2, ival1 += 2)
{
temp11v = _mm_load_si128 ((__m128i *) &mulprev[u1][k]);
temp12v = _mm_load_si128 ((__m128i *) &mulprev[u2][k]);
val1v = _mm_load_si128 ((__m128i *) &res[ival]);
val2v = _mm_load_si128 ((__m128i *) &res[ival1]);
bv = _mm_xor_si128 (val1v, _mm_unpacklo_epi64 (temp11v, temp12v));
av = _mm_xor_si128 (val2v, _mm_unpackhi_epi64 (temp11v, temp12v));
_mm_store_si128 ((__m128i *) &res[ival], bv);
_mm_store_si128 ((__m128i *) &res[ival1], av);
}
}
if (j == 0)
break;
val0v = _mm_setzero_si128();
for (i = 0; i < 40; i++)
{
testv = _mm_load_si128 ((__m128i *) &res[i]);
val1v = _mm_srli_epi64 (testv, 60);
val2v = _mm_xor_si128 (val0v, _mm_slli_epi64 (testv, 4));
_mm_store_si128 (&res[i], val2v);
val0v = val1v;
}
j--;
}
Tôi muốn giảm thời gian tính toán của chương trình. Bất kỳ đề xuất?
Bạn cần đăng mã thực tế nếu bạn muốn trợ giúp tối ưu hóa nó –
Vui lòng xem câu hỏi đã chỉnh sửa .. – anup