Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AVX convert 64 bit integer to 64 bit float

Tags:

c++

c

casting

avx

I would like to convert 4 packed 64 bit integers to 4 packed 64 bit floats using AVX. I've tried something like:

int_64t *ls = (int64_t *) _mm_malloc(256, 32);
ls[0] = a;
//...
ls[3] = d;

__mm256i packed = _mm256_load_si256((__m256i const *)ls);

Which will display in the debugger:

(gdb) print packed
$4 = {1234, 5678, 9012, 3456}

Okay so far, but the only cast/conversion operation that I can find is _mm256i_castsi256_pd, which doesn't get me what I want:

__m256d pd = _mm256_castsi256_pd(packed);

(gdb) print pd
$5 = {6.0967700696809824e-321, 2.8053047370865979e-320, 4.4525196003213139e-320, 1.7074908720273481e-320}

What I'd really like to see is:

(gdb) print pd
$5 = {1234.0, 5678.0, 9012.0, 3456.0}
like image 771
Michael Barker Avatar asked May 12 '13 23:05

Michael Barker


1 Answers

All of the cast intrinsics perform a bitwise cast, which is why you're not seeing meaningful results with that.

A vector conversion (the cvt intrinsics) between 64-bit integer and 64-bit float does not exist.

like image 160
Cory Nelson Avatar answered Sep 28 '22 10:09

Cory Nelson