C++ AMP를 실험하기 시작했습니다. 나는 단지 그것이 할 수있는 것을보기 위해 간단한 테스트 앱을 만들었지 만, 그 결과는 내게 놀랍다. 다음 코드를 고려하십시오 Timer
이 QueryPerformanceCounter에를 사용하여 간단한 타이밍 클래스가array_view :: synchronize() 호출이 왜 그렇게 느린가요?
#include <amp.h>
#include "Timer.h"
using namespace concurrency;
int main(int argc, char* argv[])
{
uint32_t u32Threads = 16;
uint32_t u32DataRank = u32Threads * 256;
uint32_t u32DataSize = (u32DataRank * u32DataRank)/u32Threads;
uint32_t* pu32Data = new (std::nothrow) uint32_t[ u32DataRank * u32DataRank ];
for (uint32_t i = 0; i < u32DataRank * u32DataRank; i++)
{
pu32Data[i] = 1;
}
uint32_t* pu32Sum = new (std::nothrow) uint32_t[ u32Threads ];
Timer tmr;
tmr.Start();
array< uint32_t, 1 > source(u32DataRank * u32DataRank, pu32Data);
array_view< uint32_t, 1 > sum(u32Threads, pu32Sum);
printf("Array<> deep copy time: %.6f\n", tmr.Stop());
tmr.Start();
parallel_for_each(
sum.extent,
[=, &source](index<1> idx) restrict(amp)
{
uint32_t u32Sum = 0;
uint32_t u32Start = idx[0] * u32DataSize;
uint32_t u32End = (idx[0] * u32DataSize) + u32DataSize;
for (uint32_t i = u32Start; i < u32End; i++)
{
u32Sum += source[i];
}
sum[idx] = u32Sum;
}
);
double dDuration = tmr.Stop();
printf("gpu computation time: %.6f\n", dDuration);
tmr.Start();
sum.synchronize();
dDuration = tmr.Stop();
printf("synchronize time: %.6f\n", dDuration);
printf("first and second row sum = %u, %u\n", pu32Sum[0], pu32Sum[1]);
tmr.Start();
for (uint32_t idx = 0; idx < u32Threads; idx++)
{
uint32_t u32Sum = 0;
for (uint32_t i = 0; i < u32DataSize; i++)
{
u32Sum += pu32Data[(idx * u32DataSize) + i];
}
pu32Sum[idx] = u32Sum;
}
dDuration = tmr.Stop();
printf("cpu computation time: %.6f\n", dDuration);
printf("first and second row sum = %u, %u\n", pu32Sum[0], pu32Sum[1]);
delete [] pu32Sum;
delete [] pu32Data;
return 0;
}
하는 것으로. 어쨌든 코드 출력은 다음과 같습니다.
Array<> deep copy time: 0.089784
gpu computation time: 0.000449
synchronize time: 8.671081
first and second row sum = 1048576, 1048576
cpu computation time: 0.006647
first and second row sum = 1048576, 1048576
왜 전화를 동기화하는 데 시간이 오래 걸립니까? 이 문제를 해결하는 방법이 있습니까? 그 외에는 계산 성능의 성능이 놀랍습니다. 그러나 synchronize() 오버 헤드로 인해 나를 사용할 수 없게됩니다.
내가 끔찍한 일을하고있을 수도 있습니다. 그렇다면 나에게 말해주십시오. 미리 감사드립니다.
을 그래서 GPU의 실제 계산이 너무 오래 걸립니다 의미와는 이미 여기에 우리의 지침을 따르십시오, p_f_e되는 동기의 가정을) 지적? 그렇다면 속도를 높일 수있는 방법이있어서 CPU만큼 빠를 것입니까? – PeterK
나는 왜 GPU 계산이 느린지를 설명하기 위해 해답을 편집했다. –
감사! 더 자세히 살펴볼 것입니다. – PeterK