2012-01-10 4 views
1

C++ AMP로 놀고 있습니다. 그러나 어떤 이유로 든 가장 다운 된 코드가 컴파일되지 않습니다. 이 : 다음과 같은 오류에parallel_for_each에서 지원되지 않는 유형 오류

concurrency::extent<2> e(2,2); 

concurrency::parallel_for_each(grid<2>(e), [](index<2> i) restrict(direct3d) { 
}); 

결과 : 단지 람다 식을 좋아하는 나타나지 않습니다

error C3576: 'wmain::': Concurrency::details::_Parallel_for_each argument #3 has unsupported type c:\program files (x86)\microsoft visual studio 11.0\vc\include\amp.h

const _Kernel_type& _Kernel

주를 위해 전달되는; AMP 지원을 포함하는 Visual Studio 11 Developer Preview를 사용하고 있습니다. "restrict (direct3d)"는 가속기가 문제의 코드를 실행하는 제어를 지원하는 새로운 키워드입니다.

아이디어가 있으십니까? 몇 가지 다른 예제에서 복사를 시도했지만 아무 것도 작동하지 않아 조금 엉망입니다.

답변

3

parallel_for_each에 전달 된 람다는 빈 클래스입니다 (변수가 캡처되지 않으므로 데이터 멤버가 없습니다). 데이터가 없으면 유용한 계산을 할 수 없기 때문에 오류가 발생합니다.

과 같이, 당신의 예에 동시 :: 배열 또는 동시성 :: array_view을 추가하십시오 :

using namespace concurrency; 
extent<2> e(2,2); 
array<int, 2> a(e); 

parallel_for_each(grid<2>(e), [&a](index<2> i) restrict(direct3d) { 
    a[i] = 1; 
}); 

참고 :이 비주얼 스튜디오 11 개발자 미리보기에만 적용됩니다. 향후 베타 버전에서 동작이 변경됩니다.코드가 오류없이 컴파일됩니다. 빈 클래스를 전달하면 아무 일도하지 않을 것입니다.

+0

내 친구는 절대 천재 (뿐만 아니라 학자와 신사)입니다! 물론 완벽하게 이해할 수 있습니다. 감사합니다. – Dave

+0

내가 도울 수있어서 기쁩니다. –

+0

이것에 더하여, 입력을 포함하지 않으면 (예를 들어 배열) 출력을 지정하면 즉 값으로 캡처 된 array_view를 지정하면 문제가 해결됩니다. 그래서 나는 람다에서 적어도 1 입력 또는 1 출력을 캡처해야한다고 생각합니다. 베타 버전에서는이 제한 사항이 완화되어 있다는 점을 잘 알고 있으며 특히 명확하지 않습니다. 당연히 뒤늦은 지혜는 훌륭한 일이며, 지금 당연히 완벽합니다. :) – Dave

0

음, 지금까지 내가 알고있는 제한 키워드는 마이크로 소프트 C++ AMP를 위해 도입 된 확장 기능입니다. 이 키워드는 Visual Studio 2010 이후에 나오는 Visual Studio C++ 컴파일러에서 지원됩니다.

2012 년 베타 릴리스 시점에는 알지 못합니다. 따라서 제 생각에 예제, 블로그 등을 찾았습니다. 새로운 C++ AMP를 사용하고 있지만 Visual Studio 2010을 사용하여 직접 작동하려고합니다.

Visual Studio 2010과 함께 제공되는 C++ 컴파일러는 제한된 키워드를 지원하지 않습니다. 이 때문에 오류가 발생합니다.

그래서 우리는 C + + AMP를 위해 VS2012 베타 릴리스를 위해 조금만 기다려야 할 것입니다. 내 손가락은 확실히 채널 9에서 Daniel Moth의 데모를 보았을 때도 가려졌습니다. -) ... 일상적인 작업에는 C++ AMP가 필요하지만 재미있는 (재생) 물건처럼 보입니다.

EDIT1

: 사실 나는 주위를 둘러 보았다 그리고 "비주얼 스튜디오 11 개발자 미리보기"C++ AMP를 사용할 것으로 보인다 릴리스가 보인다 (라이브러리와 나는 또한 구현 된 확장과 C++ 컴파일러를 가정).

EDIT2

지금 당신이 VS11을 사용하고있는 것으로 보인다 귀하의 오류 메시지가 다시 찾고 (I는 포함 파일 (마이크로 소프트 비주얼 스튜디오 11.0 :-)를 포함)의 경로에 따라 그 생각을했다. 어쩌면 당신은 값으로 캡처하고 변경할 수 같이하기 위해 람다의 캡처 모드를 지정하려고한다 :
[=](index<2> i) mutable restrict(direct3d) {} 

적어도이 람다 대부분의 C++ AMP 예제로 작성하는 방법입니다

...

+0

답변 해 주셔서 감사합니다. 네, VS2011 개발자 프리뷰를 사용하고 있다고 언급 했어야합니다. 내가 mutable 키워드를 시도하고 이것은 도움이되지 않았거나 명시 적으로 값으로 캡처하고있다. 흠. – Dave

+0

BTW, mutable 키워드는 C++ AMP로 낙담 한 것입니다. 블로그에 대한 자세한 내용은 다음 웹 사이트를 참조하십시오. –

+0

@Daniel Moth : Ok, 감사합니다. 이 경우에는이 위치 (http://msdn.microsoft.com/en-us/library/hh265136(v=vs.110).aspx)에서 msdn 콘텐츠를 검토하고 업데이트해야합니다. – ds27680

관련 문제