vs2015 cuda9.0 связал SHA1_Init с реализацией CUDA вместо библиотек openssl cpu - PullRequest
0 голосов
/ 18 декабря 2018

Я новичок в cuda, c ++, и я пытаюсь перевести код openssl sha1 cpu в cuda c, но я столкнулся с изрядной проблемой.

вот минимальный код, который может воспроизвести проблему.В этом проекте vs2015 cuda9.0 есть три файла.Это main.cpp, sha1.cu и sha1.h

//main.cpp
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "openssl\sha.h"
int main()
{
    SHA_CTX ctx;
    SHA1_Init(&ctx);
    return 0;
}

//sha1.h
#ifndef SHA1_H
#define SHA1_H
#include <stdint.h>
#include <cuda_runtime.h>
namespace cudatest {
#ifdef __cplusplus
extern "C" {
#endif
        typedef struct
        {
            uint32_t state[5];
            uint32_t count[2];
            unsigned char buffer[64];
        } SHA1_CTX;
#define SHA_CTX SHA1_CTX
#define SHA_DIGEST_LENGTH 20
        __device__  void SHA1_Init(SHA1_CTX * context);
#ifdef __cplusplus
    }
#endif
}
#endif /* SHA1_H */


//sha1.cu
#include <cuda_runtime.h>
#include "sha1.h"
namespace cudatest {
    __device__ void SHA1_Init(SHA1_CTX * context)
    {

    }
}

. Main.cpp использует компилятор C / C ++, а sha1.cu использует CUDA C / C ++

И я добавляю opensslЗаголовки в AdditionalIncludeDirectories, установите каталог, который содержит ssleay32.lib и libeay32.lib, в путь к библиотеке, установите AdditionalDependencies с ssleay32.lib, libeay32.lib.

Затем проект собран без ошибок и предупреждений,Но когда я запускаю его или отлаживаю, я обнаружил, что функция SHA1_Init запускается в коде устройства, и программа сразу же вылетает.

, почему компилятор связывает функцию SHA1_Init с устройством SHA1_Init устройства cuda, в котором вместо завернутой Cudatest пространства имен вместоa ssleay32.lib, libeay32.lib Реализация процессора?

1 Ответ

0 голосов
/ 29 декабря 2018

ОК, я обнаружил проблему. Я не должен использовать extern "C" в пространстве имен c ++. Это делает функцию видимой для глобального пространства имен.если вы определите другую функцию c SHA1_Init в файле .cpp, компоновщик будет жаловаться. Но если другой компилятор SHA1_Init находится в openssl lib, компоновщик vs C / C ++ ничего не предупредил, но связался с реализацией cuda. ​​

...