추력 펑터가 벡터화 할 수없는 불균일하게 액세스되는 읽기 전용 상태에 액세스 할 수있게하는 두 가지 방법이 있습니다. 불행히도 커널 실행 시간에는 100 배의 차이가 있습니다. 왜 두 가지 전략에 어떤 차이가 있습니까?CUDA 추력 펑션 GMEM 액세스 : ctor 데이터 복사 대 ctor dev ptr arg
더 일반적으로 : 이러한 종류의 전역에 액세스 할 수있는 추력 펑터를 제공하는 표준 방법이 있습니까?
내 첫 번째 방법은 글로벌 데이터 사본을 펑터에 넣는 것입니다.
// assuming barData is a float[]
foo<N>(barData);
내 두 번째 방법은 자신이 추력을 사용하여 장치에 업로드를 수행하는 것입니다
추력 ::의 for_each를 사용하여 호출// functor containing a copy of array dependency
template<size_t BARSIZE>
struct foo1_func
{
__align__(16) float bar[BARSIZE];
foo1_func(float _bar[BARSIZE]) { memcpy(bar,_bar,BARSIZE*sizeof(float)); }
__host__ __device__ operator()(float &t) { t = do_something(t, bar); }
}
... : 추력 기계 장치에 업로드 및 캐싱을 수행하기 위해 나타납니다 :: 업로드 한 데이터의 장치 메모리 포인터를 복사하여 내 펑터에 전달하십시오. 이 방법은 훨씬 느린 것으로 나타납니다 기꺼이 받아 정식 또는 고유 펑 패턴을 보여 소스에
추력 ::의 for_each를 사용하여 호출// functor containing device pointers to array in GMEM
struct foo2_func
{
float *bar;
foo2_func(float* _bar) { bar = bar; }
__host__ __device__ operator()(float &t) { t = do_something(t, bar); }
}
...
// assuming d_bar is a thrust::device_vector
foo(thrust::raw_pointer_cast(d_bar.data()));
링크.
일반적인 'BARSIZE'는 무엇입니까? – kangshiyin