14 #include "Float16.cuh"
22 namespace faiss {
namespace gpu {
26 static inline __device__ T load(
void* p) {
30 static inline __device__
void store(
void* p,
const T& v) {
35 #ifdef FAISS_USE_FLOAT16
39 static inline __device__ Half4 load(
void* p) {
41 asm(
"ld.global.v2.u32 {%0, %1}, [%2];" :
42 "=r"(out.a.x),
"=r"(out.b.x) :
"l"(p));
46 static inline __device__
void store(
void* p,
const Half4& v) {
47 asm(
"st.v2.u32 [%0], {%1, %2};" : :
"l"(p),
"r"(v.a.x),
"r"(v.b.x));
52 struct LoadStore<Half8> {
53 static inline __device__ Half8 load(
void* p) {
55 asm(
"ld.global.v4.u32 {%0, %1, %2, %3}, [%4];" :
56 "=r"(out.a.a.x),
"=r"(out.a.b.x),
57 "=r"(out.b.a.x),
"=r"(out.b.b.x) :
"l"(p));
61 static inline __device__
void store(
void* p,
const Half8& v) {
62 asm(
"st.v4.u32 [%0], {%1, %2, %3, %4};"
63 : :
"l"(p),
"r"(v.a.a.x),
"r"(v.a.b.x),
"r"(v.b.a.x),
"r"(v.b.b.x));
67 #endif // FAISS_USE_FLOAT16