我有一个功能如下 -
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