2012-11-30 28 views
5

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ì?

+0

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

Trả lời

2

MSDN Forum answer cho câu hỏi.

Ngữ nghĩa của các đối số mặc định, chúng tôi đã lựa chọn được liên kết với các tiền đề bao quát của C++ rằng phân tích của một chương trình được thực hiện trong một đường chuyền từ trái sang phải (mặc dù vài trường hợp ngoại lệ đáng kể cho quy tắc này, đáng chú ý nhất các hàm thành viên) - do trình chỉ định hạn chế được đọc sau khi khai báo tham số hàm, bất kỳ cuộc gọi hàm nào nằm trong các biểu thức đối số mặc định đều bị ràng buộc theo đặc tả hạn chế "bên ngoài", để tốt hơn hoặc tệ hơn. Nói cách khác, bạn đọc chương trình ngay từ đầu với hạn chế cpu "đang hoạt động" (vì nó là mặc định) và chuyển sang giới hạn X cho mọi thứ giữa "giới hạn (X)" và "}" đóng phạm vi liên quan.

+0

Có lẽ bạn nên giải thích điều này. Nó không rõ ràng với tôi những gì bạn đang nhận được tại (khác hơn là trích dẫn MSDN). – jww

Các vấn đề liên quan