«Ошибка компиляции PTX JIT» из cuModuleLoadData - PullRequest
0 голосов
/ 12 февраля 2020

Ниже приведен код:

#define FILENAME "kernel.code"
#define kernel_name "hello_world"
#define THREADS 4

std::vector<char> load_file()
{
    std::ifstream file(FILENAME, std::ios::binary | std::ios::ate);
    std::streamsize fsize = file.tellg();
    file.seekg(0, std::ios::beg);

    std::vector<char> buffer(fsize);
    if (!file.read(buffer.data(), fsize)) {
        failed("could not open code object '%s'\n", FILENAME);
    }
    return buffer;
}

struct joinable_thread : std::thread
{
    template <class... Xs>
    joinable_thread(Xs&&... xs) : std::thread(std::forward<Xs>(xs)...) // NOLINT
    {
    }

    joinable_thread& operator=(joinable_thread&& other) = default;
    joinable_thread(joinable_thread&& other)            = default;

    ~joinable_thread()
    {
        if(this->joinable())
            this->join();
    }
};

void run(const std::vector<char>& buffer) {

    CUdevice device;
    CUDACHECK(cuDeviceGet(&device, 0));
    CUcontext context;
    CUDACHECK(cuCtxCreate(&context, 0, device));

    CUmodule Module;

    CUDACHECK(cuModuleLoadData(&Module, &buffer[0]));

    ...

}

void run_multi_threads(uint32_t n) {

    {
        auto buffer = load_file();
        std::vector<joinable_thread> threads;
        for (uint32_t i = 0; i < n; i++) {
            threads.emplace_back(std::thread{[&, i, buffer] {                
                  run(buffer);
            }});
        }
    }
}

int main() {

    CUDACHECK(cuInit(0));

    run_multi_threads(THREADS);

}

А код kernel.cu, используемый для ptx, выглядит следующим образом:

#include "cuda_runtime.h"

extern "C" __global__ void hello_world(float* a, float* b) {
    int tx = threadIdx.x;
    b[tx] = a[tx];
}

Я генерирую ptx таким образом nv cc --ptx kernel.cu -o kernel.code

Я использую машину с GeForce GTX TITAN X.

И я сталкиваюсь с этой «неудачей JIT-компиляции PTX» из-за ошибки cuModuleLoadData, только когда Я пытаюсь использовать это с несколькими потоками. Если я удаляю многопоточную часть и работаю нормально, эта ошибка не возникает.

Может кто-нибудь сказать мне, что идет не так и как это преодолеть.

1 Ответ

1 голос
/ 13 февраля 2020

Как уже упоминалось в комментариях, я смог заставить его работать, переместив вызов load_file () в main, чтобы буфер считывания из файла был действительным, а затем передавал только буфер всем потокам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...