double 배열을 float 배열에 복제해야 하는데, 어떻게 해야 빠르게 복제 할 수 있을까?
예를 들어
double* a;
float* b;
가 있다면
a 안에 들어있는 모든 값들을 b 안에 최대한 빠르게 복제 하는 방법을 알고싶어
메모리 매핑이 달라서 memcpy도 안되고..
왜 ㅅㅂ Fbxsdk는 FbxVector4를 double 배열로 만든거야;;
double 배열을 float 배열에 복제해야 하는데, 어떻게 해야 빠르게 복제 할 수 있을까?
예를 들어
double* a;
float* b;
가 있다면
a 안에 들어있는 모든 값들을 b 안에 최대한 빠르게 복제 하는 방법을 알고싶어
메모리 매핑이 달라서 memcpy도 안되고..
왜 ㅅㅂ Fbxsdk는 FbxVector4를 double 배열로 만든거야;;
그냥 캐스트 하고 -mavx2 넣으면 컴파일러가 알아서 최적화해줌
ㄳㄳㄳ
루프 안에 넣고 복사할 때 캐스트 쓰라는 의미임. 더 세밀하게 하고 싶으면 openmp 쓰셈
ㄳㄳㄳㄳㄳ 사실 그냥 double, float이 아니라 XMFLOAT4, FbxVector4로 랩핑 되어있는거를 복제하려고 해서 어쩔 수 없이 느려지는 부분도 없잖아 있는듯.. 걍 감수하고 해야될 것 같다
랩핑 되어있어도 clang, gcc, msvc 전부 avx2 명령어 쓴다. 컴파일러 똑똑함
https://godbolt.org/z/MGvvYbWhM
윗댈글대러 omp + 컴파일러가 simd 적용해주게끔 코드에 힌트 좀만 주면 됨 ㅇㅅㅇ
constexpr int sizeChunk = 4; int iChunkLast = (n % sizeChunk) * sizeChunk; for(int i= 0; i<= iChunkLast; i += sizeCunk) { a[i+0] = b[i+0]; ... a[i+3] = b[i+3]; }
for(int i =iChunkLast+sizeChunk; i
오... 많이 배워가요 감사합니다
그리고 simd 적용하려면 이왕이면 16B에 정렬된게 좋고, aligned alloc 인가 그거...,alignes free 세트임. 대신 단점은 대용량 할당이 실패하니 그때는 직접 손쓰고,
어 ... 뒤에꺼가 잘렸는데 나머지 처리하는 것임
ㅃㅃ
위에 올린 어셈블리가 마음에 안 들어서 다시 해봄. 여기다 openmp를 하든 마음대로 하셈
https://godbolt.org/z/nj6MKr3co
와 ㅁㅊ union을 이렇게 응용하시네 ㄷㄷ 감사합니다