Как я могу скомпилировать код ISPC в Linux и связать его с обычным файлом cpp?

Я хочу скомпилировать программу ispc. Я пытаюсь создать исполняемый файл для одной из их примеров программ.

У меня есть simple.cpp с приведенным ниже содержимым

      #include <stdio.h>
#include <stdlib.h>

// Include the header file that the ispc compiler generates
#include "simple_ispc.h"
using namespace ispc;

int main() {
    float vin[16], vout[16];

    // Initialize input buffer
    for (int i = 0; i < 16; ++i)
        vin[i] = (float)i;

    // Call simple() function from simple.ispc file
    simple(vin, vout, 16);

    // Print results
    for (int i = 0; i < 16; ++i)
        printf("%d: simple(%f) = %f\n", i, vin[i], vout[i]);

    return 0;
}

У меня есть simple.ispc с приведенным ниже содержанием

      export void simple(uniform float vin[], uniform float vout[],
                   uniform int count) {
    foreach (index = 0 ... count) {
        // Load the appropriate input value for this program instance.
        float v = vin[index];

        // Do an arbitrary little computation, but at least make the
        // computation dependent on the value being processed
        if (v < 3.)
            v = v * v;
        else
            v = sqrt(v);

        // And write the result to the output array.
        vout[index] = v;
    }
}

Я могу использовать cmake https://github.com/ispc/ispc/tree/main/examples/cpu/simple, чтобы получить исполняемый файл, но я хочу знать необработанные команды, которые мне нужно выполнить для запуска файла simple.cpp. Может кто-нибудь подскажет, как скомпилировать и запустить файл simple.cpp с ispc?

2 ответа

Согласно руководству пользователя ISPC вы можете просто использовать ispc как команду в вашем терминале:

      ispc simple.ispc -o simple.o

Это создает объектный файл simple.o что вы можете ссылаться на свой simple.cpp файл с помощью обычного компилятора C++, например g++.

Сначала создайте файл заголовка ispc и объектный файл с помощью компилятора ispc.

      ispc --target=avx2-i32x8 simple.ispc -h simple_ispc.h -o simple_ispc.o

Затем создайте объектный файл cpp и свяжите 2 объектных файла вместе

      g++ -c simple.cpp -o simple.o
g++ simple.o simple_ispc.o -o executable

Или выполните создание исполняемого файла одной командой после создания файлов заголовка ispc и obj

      g++ simple.cpp simple_ispc.o -o executable

Кроме того, если у вас есть clang / llvm, вы также можете использовать их для компиляции. Ниже приведены шаги: https://ispc.github.io/faq.html#is-it-possible-to-inline-ispc-functions-in-cc-code

      // emit llvm IR
ispc --emit-llvm --target=avx2-i32x8 -h simple_ispc.h -o simple_ispc.bc simple.ispc
clang -O2 -c -emit-llvm -o simple.bc simple.cpp

// link the two IR files into a single file and run the LLVM optimizer on the result
llvm-link simple.bc simple_ispc.bc -o - | opt -O3 -o simple_opt.bc

// generate the native object file
llc -filetype=obj simple_opt.bc -o simple.o

// generate the executable
clang -o simple simple.o
Другие вопросы по тегам