df: 1e: hello world

This commit is contained in:
2025-12-15 16:34:01 +03:00
parent 8029d9becb
commit 3a425db8b4
4 changed files with 113 additions and 0 deletions

29
ds/25-1/1e/Makefile Normal file
View File

@ -0,0 +1,29 @@
CC = nvcc -arch=sm_75
DEBUG ?= false
DIRS = dist build
ifeq ($(DEBUG), false)
CC += -O3
else
CC += -g -G
endif
.PHONY: all run
all: $(DIRS) dist/app
dist/app: build/main.o build/op.o
$(CC) $^ -o $@ -lcuda
build/op.o: op.ptx
$(CC) $^ -dc -o $@
build/main.o: main.cu
$(CC) $^ -ptx -o build/main.ptx
$(CC) $^ -rdc=true -dc -o $@
$(DIRS):
mkdir -p $@
clean:
rm -rf $(DIRS)

View File

@ -1,3 +1,23 @@
[euclidean](https://web.archive.org/web/20230212044931/http://www-math.ucdenver.edu/~wcherowi/courses/m5410/exeucalg.html) [euclidean](https://web.archive.org/web/20230212044931/http://www-math.ucdenver.edu/~wcherowi/courses/m5410/exeucalg.html)
[ecdsa1](https://sefiks.com/2018/02/16/elegant-signatures-with-elliptic-curve-cryptography/) [ecdsa1](https://sefiks.com/2018/02/16/elegant-signatures-with-elliptic-curve-cryptography/)
[ecdsa2](https://learnmeabitcoin.com/technical/cryptography/elliptic-curve/ecdsa/) [ecdsa2](https://learnmeabitcoin.com/technical/cryptography/elliptic-curve/ecdsa/)
[ptx](https://philipfabianek.com/posts/cuda-ptx-introduction)
высокий приоритет
6, 7 State Spaces / Properties of State Spaces Ключевое отличие от CPU! В CPU память в основном плоская (RAM, кэш). В GPU есть много типов памяти: глобальная (.global), общая для блока потоков (.shared), константная (.const), локальная (.local) и т.д. Это фундамент для написания производительного кода.
19 Cost Estimates for Accessing State-Spaces Прямое продолжение предыдущего пункта. Объясняет, какая память быстрая, а какая медленная. Критично для оптимизации.
4 Operator Precedence Синтаксис PTX похож на ассемблер, но с выражениями. Знать приоритет операторов необходимо.
8 Fundamental Type Specifiers Типы данных в PTX (.b8, .s16, .f32, .b64 и т.д.). Аналог byte, word, dword в x86, но с учетом специфики GPU.
3 Predefined Identifiers Предопределенные константы, такие как %tid, %ctaid, %ntid. Это основа модели выполнения CUDA! Вместо одного потока (RIP/EIP) у вас есть идентификаторы потока, блока и сетки.
20 Operation Types Классификация инструкций PTX. Поможет быстро ориентироваться в мануале.
1 PTX Directives Директивы ассемблера (.version, .target, .global). Аналог секций и директив в NASM (SECTION .text, global _start)
средний приоритет
21 Scopes Области видимости для атомарных операций и барьеров (.cta, .cluster, .gpu, .sys). Важно для синхронизации.
14, 40, 56 Различные таблицы про Swizzling и Layout Касаются продвинутых техник работы с памятью и матрицами для оптимизации доступа. Актуально для low-level оптимизаций, похоже на работу с выравниванием и SIMD в x86.
29 Summary of Floating-Point Instructions Обзор инструкций для чисел с плавающей точкой. На GPU они крайне важны.
30-32 Cache Operators / Eviction Priority Hints Управление кэшем. Продвинутая тема для тонкой настройки, аналогичная prefetch-инструкциям в x86.
53, 55, 56 Таблицы про MMA (Matrix Multiply-Accumulate) Инструкции для тензорных ядер (аналог FMA в x86, но для матриц). Сердце производительности в AI/HPC.
22-25 Comparison Operators Особенности сравнений для целых и вещественных чисел (учет NaN).

35
ds/25-1/1e/main.cu Normal file
View File

@ -0,0 +1,35 @@
#include <stdio.h>
extern "C" __device__ void add_u32(
ulonglong4 *out_c,
ulonglong4 in_a,
ulonglong4 in_b
);
__constant__ char ok[] = "ok";
__constant__ char not_ok[] = "not ok";
__global__ void kernel(char *buf) {
ulonglong4 a = {0, 1, 2, 3};
ulonglong4 b = {1, 1, 1, 1};
ulonglong4 c = {1, 2, 3, 4};
add_u32(&c, a, b);
memcpy(buf, ok, sizeof(ok));
}
int main() {
char h_buf[32];
char *d_buf;
cudaMalloc(&d_buf, 32);
kernel<<<1, 1>>>(d_buf);
cudaDeviceSynchronize();
cudaMemcpy(h_buf, d_buf, 32, cudaMemcpyDeviceToHost);
printf("%s\n", h_buf);
cudaFree(d_buf);
return 0;
}

29
ds/25-1/1e/op.ptx Normal file
View File

@ -0,0 +1,29 @@
.version 8.4
.target sm_75
.address_size 64
.visible .func add_u32(
.param .b64 out_c,
.param .align 16 .b8 in_a[32],
.param .align 16 .b8 in_b[32]
) {
.reg .u64 %ra<4>, %rb<4>;
.reg .b64 %rdc;
ld.param.b64 %rdc, [out_c];
ld.param.v2.u64 {%ra0, %ra1}, [in_a];
ld.param.v2.u64 {%ra2, %ra3}, [in_a + 16];
ld.param.v2.u64 {%rb0, %rb1}, [in_b];
ld.param.v2.u64 {%rb2, %rb3}, [in_b + 16];
add.cc.u64 %ra0, %ra0, %rb0;
addc.cc.u64 %ra1, %ra1, %rb1;
addc.cc.u64 %ra2, %ra2, %rb2;
addc.u64 %ra3, %ra3, %rb3;
st.v2.u64 [%rdc], {%ra0, %ra1};
st.v2.u64 [%rdc + 16], {%ra2, %ra3};
ret;
}