Mã sau không thể biên dịch được. Các thông báo lỗi là:Các tham số mặc định để hạn chế các chức năng (amp)
Lỗi 1:
error C3930: 'foo' : no overloaded function has restriction specifiers that are compatible with the ambient context ''
Lỗi 2:
error C2660: 'f1' : function does not take 0 arguments
Lỗi 3:
IntelliSense: amp-restricted function "int foo() restrict(amp)" (declared at line 5) must be called from an amp-restricted function
Chương trình:
#include <amp.h>
#include <iostream>
using namespace std;
int foo() restrict(amp) { return 5; }
int f1(int x = foo()) restrict(amp) {
return x;
}
int main()
{
using namespace concurrency;
int a[10] = {0};
array_view<int> av(10, a);
parallel_for_each(av.extent, [=](index<1> i) restrict(amp) {
av[i] = f1();
});
for(unsigned i=0; i<10; ++i) {
cout << av[i] << "\n";
}
return 0;
}
Kỳ lạ thay, khi tôi xóa restrict(amp)
trên foo()
và thay thế cuộc gọi f1()
trong lambda bằng, ví dụ: 5
, chương trình sẽ biên dịch tốt. Vậy các quy tắc cho các cuộc gọi hàm trong các đối số mặc định cho các hàm amp là gì?
Tôi gặp phải các thư lạ từ cả GCC và MSVC. Nó chỉ ra tôi có một mảng 'MyStruct', và số lượng các phần tử bị tắt bởi một:' MyStruct s_val [3] = {MyStruct (...), MyStruct (...)}; '. Cả trình biên dịch đều không cho tôi biết số đếm đã tắt. – jww