Мой код DPC++ не компилируется как циклы, о которых я говорил ниже, почему?

Здравствуйте, я пытаюсь распараллелить два цикла с помощью DPC++, но это дает внутреннюю ошибку LLVM ERROR: SPIRV. Не знаю почему, ребята, не могли бы вы помочь мне разобраться в проблеме?

https://simplecore-ger.intel.com/techdecoded/wp-content/uploads/sites/11/Webinar-Slides-DPC-Part-1-An-Introduction-to-the-New-Programming-Model-.pdf

https://simplecore-ger.intel.com/techdecoded/wp-content/uploads/sites/11/Webinar-Slides-DPC-Part-2-Programming-Best-Practices.pdf

char* rsa_decrypt_without_private_key(const long long* message, const unsigned long message_size, const struct public_key_class* pub)
{
    struct private_key_class unknownpriv[1];
    long long p, q, phi_max, e, d;
    p = public_prime;
    q = pub->modulus / p;
    phi_max = (p - 1) * (q - 1);
    e = powl(2, 8) + 1;
    d = ExtEuclid(phi_max, e);
    while (d < 0) {
        d = d + phi_max;
    }
    unknownpriv->modulus = pub->modulus;
    unknownpriv->exponent = d;

    if (message_size % sizeof(long long) != 0) {
        fprintf(stderr, "Error: message_size is not divisible by %d, so cannot be output of rsa_encrypt\n", (int)sizeof(long long));
        return NULL;
    }
    
    char* decrypted = (char*) malloc(message_size / sizeof(long long));
    
    char* temp = (char*) malloc(message_size);
    if ((decrypted == NULL) || (temp == NULL)) {
        fprintf(stderr, "Error: Heap allocation failed.\n");
        return NULL;
    }

    buffer<char, 1> A(decrypted, range<1>{ message_size / sizeof(long long)});
    buffer<char, 1> B(temp, range<1>{ message_size });
    auto R = range<1>{ message_size / 8 };
    queue z;

    z.submit([&](handler& h) {
        auto out = B.get_access<access::mode::write>(h);
        h.parallel_for(R, [=](id<1> i) {
            out[i] = rsa_modExp(message[i], unknownpriv->exponent, unknownpriv->modulus);
        });
    });


    z.submit([&](handler& h) {
        auto out = A.get_access<access::mode::write>(h);
        auto in = B.get_access<access::mode::read>(h);
        h.parallel_for(R, [=](id<1> i) {
            out[i] = in[i];
        });
    });
    
    /*
    for (i = 0; i < message_size / 8; i++) {
        temp[i] = rsa_modExp(message[i], unknownpriv->exponent, unknownpriv->modulus);
    }

    for (i = 0; i < message_size / 8; i++) {
        decrypted[i] = temp[i];
    }*/

    free(temp);
    return decrypted;
}

1 ответ

Поскольку вы пытаетесь вызвать функцию (rsa_modExp) внутри ядра parallel_for, вам необходимо убедиться, что функция присутствует в той же единице трансляции.

Когда мы хотим вызвать функции внутри ядра, которые определены в другом блоке трансляции, эти функции должны быть помечены как SYCL_EXTERNAL. Без этого атрибута компилятор будет компилировать функцию только для использования вне кода устройства (что делает незаконным вызов этой внешней функции из кода устройства).

Ссылка на книгу DPC++ для получения дополнительной информации:https://www.apress.com/us/book/9781484255735 (Глава 13)

Другие вопросы по тегам