Clang 3.0 có thể biên dịch OpenCL thành ptx và sử dụng công cụ của Nvidia để khởi chạy mã ptx trên GPU. Tôi có thể làm cái này như thế nào? Hãy cụ thể.Làm thế nào để sử dụng clang để biên dịch OpenCL thành mã ptx?
Trả lời
Xem Justin Holewinski's blog để biết ví dụ cụ thể hoặc this thread để biết thêm một số bước chi tiết và liên kết đến mẫu.
Dưới đây là hướng dẫn ngắn gọn cách thực hiện với thân cây Clang (3.4 tại điểm này) và libclc. Tôi cho rằng bạn có kiến thức cơ bản về cách cấu hình và biên dịch LLVM và Clang, vì vậy tôi chỉ liệt kê các cờ cấu hình mà tôi đã sử dụng.
square.cl:
__kernel void vector_square(__global float4* input, __global float4* output) {
int i = get_global_id(0);
output[i] = input[i]*input[i];
}
Compile llvm và kêu vang với sự hỗ trợ nvptx:
../llvm-trunk/configure --prefix=$PWD/../install-trunk --enable-debug-runtime --enable-jit --enable-targets=x86,x86_64,nvptx make install
Nhận libclc (git clone http://llvm.org/git/libclc.git) và biên dịch nó.
./configure.py --with-llvm-config=$PWD/../install-trunk/bin/llvm-config make
Nếu bạn có vấn đề biên dịch này, bạn có thể cần phải sửa chữa vài tiêu đề trong ./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"
kernel Compile để LLVM IR Assember :
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
Liên kết nhân với triển khai xây dựng trong từ libclc
llvm-link libclc/nvptx--nvidiacl/lib/builtins.bc square.ll -o square.linked.bc
Compile liên kết đầy đủ LLVM IR để 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;
}
Với phiên bản hiện tại của các llvm (3.4), libclc và nvptx back-end, quá trình biên dịch đã thay đổi một chút.
Bạn phải nói rõ với phần phụ trợ nvptx mà giao diện trình điều khiển sử dụng; các tùy chọn của bạn là nvptx-nvidia-cuda hoặc nvptx-nvidia-nvcl (cho OpenCL) và 64 bit tương đương nvptx64-nvidia-cuda hoặc nvptx64-nvidia-nvcl của chúng.
Mã .ptx được tạo khác nhau tùy theo giao diện đã chọn. Trong mã assembly được tạo ra cho API trình điều khiển CUDA, nội tại .global và .ptr bị loại bỏ khỏi các hàm mục nhập nhưng chúng được yêu cầu bởi OpenCL.Tôi đã sửa đổi các bước biên dịch Mikael của hơi để sản xuất mã mà có thể chạy với OpenCL host:
Compile để 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
liên kết hạt nhân:
llvm-link libclc/built_libs/nvptx64--nvidiacl.bc test.ll -o test.linked.bc
Biên dịch sang Ptx:
clang -target nvptx64-nvidia-nvcl test.linked.bc -S -o test.nvptx.s
Đối với tôi, tôi đã phải chuyển đổi hai đầu vào ở bướC# 2 để làm cho nó liên kết đúng cách. Nguồn: https://groups.google.com/forum/#!msg/llvm-dev/Iv_u_3wh4lU/XINHv5HbAAAJ – Andrew
- 1. làm thế nào để sử dụng llvm + clang để biên dịch cho stm32
- 2. Làm cách nào để biên dịch C++ bằng Clang?
- 3. Cách biên dịch clang thành llvm IR
- 4. Làm thế nào để cài đặt CLang bằng cách sử dụng nhị phân biên dịch sẵn?
- 5. Làm thế nào để biên dịch hạt nhân OpenCL thành bitstream?
- 6. Sử dụng #include để tải mã OpenCL
- 7. Làm thế nào để sử dụng clCreateProgramWithBinary trong OpenCL?
- 8. Bất kỳ hướng dẫn nào để nhúng Clang làm trình thông dịch script thành Mã C++?
- 9. Làm thế nào để biên dịch/liên kết Boost với clang ++/libC++?
- 10. Làm cách nào để sử dụng OpenCL trên Android?
- 11. Làm thế nào để biên dịch mã sử dụng #include <thread>
- 12. Làm thế nào để thiết lập classpath khi tôi sử dụng javax.tools.JavaCompiler biên dịch mã nguồn?
- 13. Biên dịch OpenCL trên Mingw Nvidia SDK
- 14. Clang và Intel không biên dịch mã CRTP này
- 15. F # Làm thế nào để biên dịch một mã báo giá thành một assembly
- 16. Làm thế nào để biên dịch RarCrack trên Mac OSX?
- 17. Tại sao mã C++ này biên dịch khi sử dụng clang -std = gnu ++ 11?
- 18. Biên dịch mã OpenMP thành mã C
- 19. Tôi làm cách nào để sử dụng trình biên dịch Google Closure để xóa mã JavaScript không sử dụng?
- 20. Làm thế nào để sử dụng trình biên dịch 'yield return' để xây dựng một lớp
- 21. Làm thế nào để Eclipse sử dụng JDK8 để biên dịch một dự án?
- 22. Biên dịch java thành mã gốc?
- 23. Làm thế nào để cấu trúc hạt nhân OpenCL lớn?
- 24. Làm cách nào để biên dịch mã objc trên Linux?
- 25. Sử dụng `sourceCpp` để biên dịch` fastLm`
- 26. làm thế nào để xem CLang AST?
- 27. Trong cmake, làm thế nào tôi có thể kiểm tra nếu trình biên dịch là Clang?
- 28. Cách biên dịch ocaml thành mã gốc
- 29. Làm thế nào để biên dịch OpenCV bằng libjpeg-turbo?
- 30. Làm cách nào để viết và biên dịch mã Mục tiêu-C?
Liên kết blog không hoạt động nữa. Ngoài ra nếu tôi nhớ chính xác nó đã bị phản đối thông tin. –
Tôi đã cố định một cách trivially liên kết blog. – sschuberth