Clang 3.0 puede compilar OpenCL a ptx y usar la herramienta de Nvidia para iniciar el código ptx en la GPU. ¿Cómo puedo hacer esto? Por favor sea especifico.¿Cómo usar clang para compilar código OpenCL a ptx?
Respuesta
Consulte Justin Holewinski's blog para obtener un ejemplo específico o this thread para obtener algunos pasos más detallados y vínculos a las muestras.
Aquí hay una breve guía de cómo hacerlo con Clang trunk (3.4 en este punto) y libclc. Supongo que tiene conocimientos básicos sobre cómo configurar y compilar LLVM y Clang, por lo que acabo de enumerar los indicadores de configuración que he utilizado.
square.cl:
__kernel void vector_square(__global float4* input, __global float4* output) {
int i = get_global_id(0);
output[i] = input[i]*input[i];
}
llvm Compilar y sonido metálico con soporte nvptx:
../llvm-trunk/configure --prefix=$PWD/../install-trunk --enable-debug-runtime --enable-jit --enable-targets=x86,x86_64,nvptx make install
Obtener libclc (git clone http://llvm.org/git/libclc.git) y compilarlo.
./configure.py --with-llvm-config=$PWD/../install-trunk/bin/llvm-config make
Si tiene problemas para compilar este puede que tenga que corregir par de cabeceras en ./utils/prepare-builtins.cpp
-#include "llvm/Function.h"
-#include "llvm/GlobalVariable.h"
-#include "llvm/LLVMContext.h"
-#include "llvm/Module.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/GlobalVariable.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Module.h"
de compilación del kernel a Assember LLVM IR :
clang -Dcl_clang_storage_class_specifiers -isystem libclc/generic/include -include clc/clc.h -target nvptx -xcl square.cl -emit-llvm -S -o square.ll
Enlace kernel con implementaciones incorporadas de libclc
llvm-link libclc/nvptx--nvidiacl/lib/builtins.bc square.ll -o square.linked.bc
Compilar totalmente vinculado LLVM IR a PTX
clang -target nvptx square.linked.bc -S -o square.nvptx.s
square.nvptx.s:
//
// Generated by LLVM NVPTX Back-End
//
.version 3.1
.target sm_20, texmode_independent
.address_size 32
// .globl vector_square
.entry vector_square(
.param .u32 .ptr .global .align 16 vector_square_param_0,
.param .u32 .ptr .global .align 16 vector_square_param_1
)
{
.reg .pred %p<396>;
.reg .s16 %rc<396>;
.reg .s16 %rs<396>;
.reg .s32 %r<396>;
.reg .s64 %rl<396>;
.reg .f32 %f<396>;
.reg .f64 %fl<396>;
ld.param.u32 %r0, [vector_square_param_0];
mov.u32 %r1, %ctaid.x;
ld.param.u32 %r2, [vector_square_param_1];
mov.u32 %r3, %ntid.x;
mov.u32 %r4, %tid.x;
mad.lo.s32 %r1, %r3, %r1, %r4;
shl.b32 %r1, %r1, 4;
add.s32 %r0, %r0, %r1;
ld.global.v4.f32 {%f0, %f1, %f2, %f3}, [%r0];
mul.f32 %f0, %f0, %f0;
mul.f32 %f1, %f1, %f1;
mul.f32 %f2, %f2, %f2;
mul.f32 %f3, %f3, %f3;
add.s32 %r0, %r2, %r1;
st.global.f32 [%r0+12], %f3;
st.global.f32 [%r0+8], %f2;
st.global.f32 [%r0+4], %f1;
st.global.f32 [%r0], %f0;
ret;
}
Con la versión actual de de llvm (3.4), back-end libclc y nvptx, el proceso de compilación ha cambiado ligeramente.
Tiene que decirle explícitamente al back-end nvptx qué interfaz del controlador usar; sus opciones son nvptx-nvidia-cuda o nvptx-nvidia-nvcl (para OpenCL) y sus equivalentes de 64 bits nvptx64-nvidia-cuda o nvptx64-nvidia-nvcl.
El código .ptx generado difiere ligeramente según la interfaz elegida. En el código ensamblado producido para la API del controlador CUDA, los intrínsecos .global y .ptr se eliminan de las funciones de entrada, pero son requeridos por OpenCL.He modificado los pasos de compilación de Mikael ligeramente para producir código que se pueden ejecutar con OpenCL anfitrión:
Compilar a LLVM IR:
clang -Dcl_clang_storage_class_specifiers -isystem libclc/generic/include -include clc/clc.h -target nvptx64-nvidia-nvcl -xcl test.cl -emit-llvm -S -o test.ll
Enlace núcleo:
llvm-link libclc/built_libs/nvptx64--nvidiacl.bc test.ll -o test.linked.bc
Compilar a Ptx:
clang -target nvptx64-nvidia-nvcl test.linked.bc -S -o test.nvptx.s
Para mí tuve que cambiar las dos entradas en el paso # 2 para que se vincule correctamente. Fuente: https://groups.google.com/forum/#!msg/llvm-dev/Iv_u_3wh4lU/XINHv5HbAAAJ – Andrew
- 1. cómo usar llvm + clang para compilar para stm32
- 2. ¿Cómo compilar el kernel OpenCL en Bitstream?
- 3. Cómo usar clCreateProgramWithBinary en OpenCL?
- 4. Usando #include para cargar el código OpenCL
- 5. ¿Qué macro predefinida puedo usar para detectar clang?
- 6. Usar Clang con MSVC 2010
- 7. ¿Cómo puedo compilar el código CUDA y luego vincularlo a un proyecto C++?
- 8. Cuándo usar Cygwin o MinGW para compilar el código C?
- 9. Problemas al compilar el Objetivo C con Clang (Ubuntu)
- 10. ¿Cómo compilo C++ con Clang?
- 11. Depurador para OpenCL
- 12. Cómo compilar código VB6 heredado
- 13. ¿Puedo usar .NET Reflector para modificar y volver a compilar el código rápidamente?
- 14. ¿Se puede optimizar este código OpenCL?
- 15. Enlazador para Clang?
- 16. Cómo estructurar kernels OpenCL grandes?
- 17. ¿Cómo usar una matriz 3-D en el kernel OpenCL?
- 18. ¿Cómo compilar scripts de Python para usar en FORTRAN?
- 19. Cómo usar las referencias al compilar el código C# a través de la línea de comando
- 20. ¿Cómo compilar y compilar PJSIP para Xcode, usando el código de muestra IPJSUA para probar?
- 21. Usando Notepad ++ para compilar el código Java
- 22. CUDA: Comprender la información de PTX
- 23. OpenCL para Python
- 24. ¿Cómo puedo obtener este código que implica unique_ptr para compilar?
- 25. Código de ejemplo para activar el analizador estático de Clang
- 26. ¿Cómo usar GCC para compilar el código C en el ensamblaje 8088?
- 27. ¿Cómo puedo usar gcc para compilar el código ensamblador x86 en una computadora x64
- 28. ¿Cómo compilar CodeCompileUnit a partir del código fuente?
- 29. Preguntas para compilar a LLVM
- 30. Distribución de OpenCL
El enlace del blog ya no funciona. Además, si recuerdo correctamente, fue información obsoleta. –
He reparado trivialmente el enlace del blog. – sschuberth