device_vector.swap()
은 메모리 이동을 방지합니다. 우리가 그것을 프로파일 않으면 타임 라인에서 아무 장치 간 메모리 움직임을 볼
d_b.swap(d_a);
사용
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <thrust\device_vector.h>
void printDeviceVector(thrust::device_vector<int> &d_a) {
for (int k = 0; k < d_a.size(); k++) {
int temp = d_a[k];
printf("%i\n", temp);
}
}
int main()
{
const int N = 10;
thrust::device_vector<int> d_a(N, 1);
thrust::device_vector<int> d_b(N, 2);
// --- Original
printf("Original device vector d_a\n");
printDeviceVector(d_a);
printf("Original device vector d_b\n");
printDeviceVector(d_b);
d_b.swap(d_a);
// --- Original
printf("Final device vector d_a\n");
printDeviceVector(d_a);
printf("Final device vector d_b\n");
printDeviceVector(d_b);
d_a.clear();
thrust::device_vector<int>().swap(d_a);
d_b.clear();
thrust::device_vector<int>().swap(d_b);
cudaDeviceReset();
return 0;
}
:
실제로
다음 코드를 고려
반대쪽에있는 경우 d_b.swap(d_a)
에
d_b = d_a;
는 장치 간 움직임이 타임 라인에 나타납니다
![enter image description here](https://i.stack.imgur.com/en9OE.jpg)
마지막으로, 타이밍은 오히려 d_b = d_a
보다 d_b.swap(d_a)
에 찬성 크게이다. N = 33554432
들어, 타이밍
d_b.swap(d_a) 0.001152ms
d_b = d_a 3.181824ms
은'추력 :: vector' 클래스는 벡터의 내용을 저장하는 데 사용되는 유형 'contiguous_storage'의 부재를 가진다. 벡터가 바뀌면, 내부적으로'begin()'반복자,'contiguous_storage'의'size'와'allocator' 만 바뀝니다. 따라서 관련된 데이터의 메모리 복사본이 없습니다. 이 파일은 'contiguous_storage.inl' 파일의 [swap'] (https://github.com/thrust/thrust/blob/master/thrust/detail/contiguous_storage.inl#L181) 멤버 함수에서 확인할 수 있습니다. – sgarizvi
대입 연산자의 경우, ['vector_base :: operator ='] (https://github.com/thrust/thrust/blob/master/thrust/detail/vector_base.inl#L89) 코드를 보면,), 벡터 내용의 완전한 메모리 복사본을 수행하는 것처럼 보이는'assign' 함수를 사용합니다. – sgarizvi
@sgarizvi 의견을 보내 주셔서 감사합니다.사실, 이것은 아래의 그의 의견에서 지적한 것과 동일한 반대입니다. 그러나 이상한 것은 타임 라인에서 메모리 복사본을 찾을 수 없다는 것입니다. 아마도'추력'은 카피를하기 위해 커널을 사용 했을까? – JackOLantern