【发布时间】:2018-08-24 04:23:52
【问题描述】:
我正在使用 _mm512_cvt_roundpd_epi64 并不断收到编译器错误:
/dump/1/alicpp2/built/gcc-7.3.0-7u2/gcc-7.3.0/lib/gcc/x86_64-pc-linux-gnu/7.3.0/include/avx512dqintrin.h:1574: 14: 错误:不正确的舍入操作数 __R);
这是我的代码:
#include <iostream>
#include <immintrin.h>
void Date64Align(int64_t* dst, int64_t* src, size_t length) {
constexpr int dop = 512 / 64;
int64_t starting_epoch_milliseconds_ = 1513728000;
int32_t granularity_milliseconds_ = 3600;
__m512i start = _mm512_set1_epi64(starting_epoch_milliseconds_);
__m512i granularity = _mm512_set1_epi64(granularity_milliseconds_);
double temp = (double)granularity_milliseconds_;
__m512d granularity_double = _mm512_set1_pd(temp);
for (int i = 0; i < length / dop; ++i) {
// load the src (load X into SIMD register
__m512i data = _mm512_load_epi64(src);
// X - starting_epoch_milliseconds_
data = _mm512_sub_epi64(data, start);
// convert X to double
__m512d double_data;
double_data = _mm512_cvt_roundepi64_pd(data, _MM_FROUND_TO_NEAREST_INT);
// X = X / Y in double
double_data = _mm512_div_pd(double_data, granularity_double);
// Convert X to int64
data = _mm512_cvt_roundpd_epi64(double_data, _MM_FROUND_NO_EXC);
data = _mm512_mullo_epi64(data, granularity);
// store X
_mm512_store_epi64(dst, data);
src += dop;
dst += dop;
}
}
int main() {
return 0;
}
还有我的 CMakeFileLists.txt:
cmake_minimum_required(VERSION 3.11)
project(untitled3)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb -msse4.2 -mavx512f -
mavx512dq")
add_executable(untitled3 main.cpp)
有人熟悉 AVX512 库并帮助回答我的问题吗?
【问题讨论】:
-
你能发一个minimal reproducible example,我实际上可以复制/粘贴到gcc.godbolt.org看看吗?你
#include <immintrin.h>并使用-march=native或-march=skylake-avx512编译? -
你确定你不能使用 2 的幂粒度,所以你可以移动而不是使用相对较慢的
mullo_epi64吗? (并乘以逆而不是除。)不幸的是_mm512_roundscale_pd不起作用,它不允许负数的小数位。 (instrinsic _mm512_round_ps is missing for AVX512) -
感谢您的回复。我用一个最小的例子更新了代码,并附上了一个 CMakeFileLists.txt。请你帮忙看看好吗?