0

我有一个功能如下 -

void dxy_SIMD(uchar* img_ptr, uchar* dxy_ptr, size_t M, size_t N){
    
    for (size_t i = 1; i < M - 1; i++)
    {
        for (size_t j = 1; j < N; j += 32)
        {
            auto idx_before = (i - 1)*N + j;
            auto idx = i * N + j;
            auto idx_after = (i + 1) * N + j;

            _mm_prefetch(img_ptr + idx - 1, _MM_HINT_T0);
            _mm_prefetch(img_ptr + idx_before, _MM_HINT_T0);
            _mm_prefetch(img_ptr + idx_after, _MM_HINT_T0);

            auto after = _mm256_loadu_epi8(img_ptr + idx_after);
            auto current = _mm256_loadu_epi8(img_ptr + idx);
            auto before = _mm256_loadu_epi8(img_ptr + idx_before);

            auto dx = _mm256_add_epi8(_mm256_loadu_epi8(img_ptr + idx + 1), _mm256_loadu_epi8(img_ptr +idx - 1));
            auto dy = _mm256_add_epi8(after, before);

            auto negative_middle = _mm256_sub_epi8(current, _mm256_add_epi8(current, current)); // convert x to -x by doing x - 2x
            auto negative_middle_times_three = _mm256_add_epi8(negative_middle, _mm256_add_epi8(negative_middle, negative_middle)); // Get -3x here
            auto negative_middle_times_four = _mm256_add_epi8(negative_middle, negative_middle_times_three); // Getting -4x here. -> Illegal Instruction error thrown

            _mm256_storeu_epi8(dxy_ptr + idx, _mm256_add_epi8(dx, _mm256_add_epi8(negative_middle_times_four, dy)));
        }
        
    }
}

但是,Illegal instruction (core dumped)当函数运行时,我遇到了非法指令错误(),并且在行抛出错误(如 gdb 所示) -

 auto negative_middle_times_four = _mm256_add_epi8(negative_middle, negative_middle_times_three);

我目前正在使用英特尔的dpcpp编译器并添加以下编译选项 - -g -O3 -fsycl -fsycl-targets=spir64 -mavx512vl -mavx512bw -mavx512f

我的 CPU 是 i7 9750h,我知道它只支持 until avx2,但是我添加了这些标志,因为当我在我的代码中运行一些其他函数来编译mavx512时,编译器通过抛出错误来特别要求它。make但是,这些函数的操作几乎与dxy_SIMD完美运行相同。

我无法理解错误的来源,为什么它会抛出一个错误,Illegal Instruction Error即使我一直在相同的代码和相同的函数中使用该内在函数。

TIA

4

0 回答 0