13 #include "Float16.cuh"
21 namespace faiss {
namespace gpu {
25 static inline __device__ T load(
void* p) {
29 static inline __device__
void store(
void* p,
const T& v) {
34 #ifdef FAISS_USE_FLOAT16
38 static inline __device__ Half4 load(
void* p) {
40 asm(
"ld.global.v2.u32 {%0, %1}, [%2];" :
41 "=r"(out.a.x),
"=r"(out.b.x) :
"l"(p));
45 static inline __device__
void store(
void* p,
const Half4& v) {
46 asm(
"st.v2.u32 [%0], {%1, %2};" : :
"l"(p),
"r"(v.a.x),
"r"(v.b.x));
51 struct LoadStore<Half8> {
52 static inline __device__ Half8 load(
void* p) {
54 asm(
"ld.global.v4.u32 {%0, %1, %2, %3}, [%4];" :
55 "=r"(out.a.a.x),
"=r"(out.a.b.x),
56 "=r"(out.b.a.x),
"=r"(out.b.b.x) :
"l"(p));
60 static inline __device__
void store(
void* p,
const Half8& v) {
61 asm(
"st.v4.u32 [%0], {%1, %2, %3, %4};"
62 : :
"l"(p),
"r"(v.a.a.x),
"r"(v.a.b.x),
"r"(v.b.a.x),
"r"(v.b.b.x));
66 #endif // FAISS_USE_FLOAT16