رفتن به مطلب
مرورگر پیشنهادی آرساکیا گیم مرورگر های تحت موتور کرومیوم می‌باشد، برای دانلود روی مرورگر انتخابی خود کلیک کنید
Google Chrome Microsoft Edge Ungoogled Chromium Brave Opera GX Opera

All CPU & GPU Architectures


ارسال‌های توصیه شده

In the name of God

 

سلامممممممممممممممم می ارزم دمت تمامی دوستان و همراهان همیشگی

 

امیدوارم حالتون خوب و حال دلتون بهتر باشه!

 

امروز با یه موضوع جذابی در خدمت شما هستیم, موضوعی در رابطه با معماری های پردازنده های مرکزی و پردازنده های گرافیکی

 

خب ببینید, شما وقتی لانچر آرساکیا گیم رو با نوت پد باز کنید, با همچین صحنه ای روبه رو خواهید شد (حالا من با نوت پد بازش نکردم :D):

2a5f-arsacia.jpg

ما اصطلاحا به اینا میگیم کد ماشین

دقت کنید دوستان, کد اسمبلی و اینا نه, کد ماشین

دوستان اولین آفست (اصطلاحا به هرکدوم میگیم یه آفست, اینی که من میگم میشه آفست 0x00) که نوشته داخلش "4D 5A", این DOS Header هستش, یعنی این یه فایل اجرایی هستش

بعدش نگاه کنید نوشته "90 00 03 00", این یک اشاره گر/پوینتر به امضای PE (نه خود امضای PE) هستش (File Ending ای که متعلق به ویندوز هستش)

و حالا تا آخر

 

اما خب این کدی که وجود داره اینجا, از یه کد اسمبلی تبدیل به این شده

ببینید دوستان من کاری ندارم که توسعه دهنده ی لانچر آرساکیا با گولنگ نوشته, با سی, سی پلاس پلاس, سی شارپ, یا چمیدونم Rust, Dlang, Zig و...

در نهایت, یه چیزی در مباحث بیلد گرفتن به اسم Assembler اینارو به اسمبلی تبدیل میکنه و از Assembly به کد ماشین

یعنی در نهایت از گولنگش تا Zigش در نهایت میشن Assembly برای هر معماری

حالا این لانچر آرساکیا تا جایی که معلومه یا x86 (32 بیت) هستش یا x86_64 (64 بیت) (من که میدونم تا قبل از اینکه اینو بگم فکر میکردید ARM و PowerPC هستش ولی نمیتونم ثابت کنم: =)))

و اینم خلاصه ی ماجرا

اما خب مبحث اصلی ما این نیست, مبحث اصلی ما معماری ها هستن که تا الان چهار تاشون رو لو دادم (x86, x86_64, ARM, و PowerPC)

 

خب, اول میریم سراغ اینکه اصلا معماری چیه, بعدش میریم سراغ معرفی معماری ها از اول تا همین الان!

 

1- معماری پردازنده های مرکزی و گرافیکی چیه؟

خب, ببینید, دوستان شما فرض کنید

شما که ایرانی هستی, آیا من با شما انگلیسی صحبت میکنم؟

یا فرانسوی؟

من با شما دارم فارسی حرف میزنم

ولی با کسی که آلمانی باشه, انگلیسی یا روسی حرف نمیزنم یا حتی فارسی

من با شما آلمانی حرف میزنم

حالا دقیقا برای پردازنده ها و کارت ای گرافیک هم همینه

پردازنده شما که Smart CPU نیستش بیاد خودش بفهمه از چشماتون که الان چی میخواید بگید

یک سری کد های عجیب غریب, که اصطلاحا بهشون میگیم کد اسمبلی, باید بنویسیم

حالا زبان پردازنده های مرکزی و گرافیکی زبون بسته, معماری ها هستن

معماری ها مثل x86, x86_64, ARM, ARM64, RISC-V, Motorola 6800, PowerPC و... هستن

خیلی زیادن, معماری های پردازنده مرکزی از سال 1971 و اولین بار توسط شرکت اینتل ساخته شد

از اون سال تا کنون, 150~ تا معماری وجود داره

و برای پردازنده های گرافیکی از سال 1996 شروع شد و اولین معماری 3dfx Voodoo بودش

و تا کنون نزدیک 100~ معماری برای پردازنده های گرافیکی وجود داره

 

حتی براتون مثال هم میتونم بزنم (البته از ARM (NEON), x86, x86_64 و RISC-V, چون من فقط همین 4 تارو دست و پا شکته کار میکنم -_- (صد البته که برای لینوکس هستن)):

این کد هایی که میدم برای لینوکس هستن حواستون باشه فقط!

x86 - Linux

.section .data
msg:    .ascii "Hello!\n"
len = . - msg

.section .text
.globl _start
_start:
    movl    $4, %eax        # syscall: write
    movl    $1, %ebx        # fd: stdout
    movl    $msg, %ecx      # buffer
    movl    $len, %edx      # length
    int     $0x80

    movl    $1, %eax        # syscall: exit
    xorl    %ebx, %ebx      # status: 0
    int     $0x80

x86_64 - Linux

.section .data
msg:    .ascii "Hello!\n"
len = . - msg

.section .text
.globl _start
_start:
    movq    $1, %rax        # syscall: write
    movq    $1, %rdi        # fd: stdout
    leaq    msg(%rip), %rsi # buffer
    movq    $len, %rdx      # length
    syscall

    movq    $60, %rax       # syscall: exit
    xorq    %rdi, %rdi      # status: 0
    syscall

ARM - NEON - Linux

.section .data
msg:    .ascii "Hello!\n"
len = . - msg

.section .text
.globl _start
_start:
    mov     r7, #4          # syscall: write
    mov     r0, #1          # fd: stdout
    ldr     r1, =msg        # buffer
    ldr     r2, =len        # length
    svc     #0

    mov     r7, #1          # syscall: exit
    mov     r0, #0          # status: 0
    svc     #0

ARM64 - NEON - Linux

.section .data
msg:    .ascii "Hello!\n"
len = . - msg

.section .text
.globl _start
_start:
    mov     x16, #64        # syscall: write
    mov     x0, #1          # fd: stdout
    ldr     x1, =msg        # buffer
    ldr     x2, =len        # length
    svc     #0

    mov     x16, #93        # syscall: exit
    mov     x0, #0          # status: 0
    svc     #0

RISC-V - Linux

.section .data
msg:    .ascii "Hello!\n"
len = . - msg

.section .text
.globl _start
_start:
    li      a7, 64          # syscall: write
    li      a0, 1           # fd: stdout
    la      a1, msg         # buffer
    li      a2, 6           # length
    ecall

    li      a7, 93          # syscall: exit
    li      a0, 0           # status: 0
    ecall

و حالا اگر لینوکس باشید, با دستور زیر میتونید اجراش کنید:

# x86
as -32 hello.s -o hello.o
ld -m elf_i386 hello.o -o hello
./hello

# x86_64
as hello.s -o hello.o
ld hello.o -o hello
./hello

# ARM
as -32 hello.s -o hello.o
ld -m elf32larm hello.o -o hello
./hello

# ARM64
as hello.s -o hello.o
ld hello.o -o hello
./hello

# RISC-V
as -march=rv64gc hello.s -o hello.o
ld -m elf64lriscv hello.o -o hello
./hello

 

ولی خب دوستان ببینید, هرکدوم از اینا یک سری نام های مشابه هم دارن که حالا در پایین بهتون گفتم:

x86 (32-bit) -> i386, i486, ,i586 i686, x86
رایج ترین نام مشابه: i386

x86-64 (64-bit) -> x86_64, x64, amd64

رایج ترین نام مشابه: amd64 (ببینید, یه توضیح مختصر بدم, i386 تا i686 متعلق به اینتل هستش, و x64 هم همینطور, ولی وقتی AMD وارد بازی پردازنده ها شد و amd64 رو ساخت, اومدن برای اینکه دعوای مالکیتی نشه بین این دو شرکت غول, اومدن اسم های x86 و x86_64 رو انتخاب کردن که شامله اینتل و AMD میشد)

ARM (32-bit) -> arm, armv7, armhf, armv7l

رایج ترین نام مشابه: arm

ARM64 (64-bit) -> aarch64, arm64

رایج ترین نام مشابه: aarch64

RISC-V (32-bit) -> rv32, rv32gc, riscv32

رایج ترین نام مشابه: riscv32

RISC-V (64-bit) -> rv64, rv64gc, riscv64

رایج ترین نام مشابه: riscv64

PowerPC (32-bit) -> ppc, powerpc

رایج ترین نام مشابه: powerpc

PowerPC (64-bit) -> ppc64, ppc64le

رایج ترین نام مشابه: ppc64

و اینم از پردازنده های مرکزی

اما خب پردازنده های گرافیکی خیلی جذاب تر هستن

یکمی پردازنده های گرافیکی فرق دارن با پردازنده های مرکزی

شما باید برای پردازنده های مرکزی API های متفاوتی برای هر نسخه بنویسید

اما در کارت های گرافیک, به این شکل هستش که یه زبانی رو, مثل CUDA برای NVIDIA (غول کارت های گرافیک), ROCm برای AMD (جدید ولی طلایی), oneAPI بر پایه ی استاندارد SYCL (سیکل) و DPC++ (دی پی سی پلاس پلاس) (نسخه ی Intel عه SYCL) برای شرکت Intel (قدیمی ولی طلایی) (البته جدیدا oneAPI برای NVIDIA و AMD هم اومده), و یا Metal برای کارت های گرافیک Apple میدن و شما میتونید کارهارو با اونا پیش ببرید

البته, پروژه های جاه طلبانه و موفقی هم وجود داشتن برای ارایه ی یک API واحد ه وقتی بیلد بگیریشون, خودشون برای هر پلتفرم خودشون رو سینک میکنن

مثل HIP برای ROCm و CUDA, یا OpenCL و Vulkan Compute برای تمام کارت های گرافیک!

برخلاف HIP که بیلد میگیره به CUDA و ROCm, زبان ها یا فریم ورک های OpenCL و Vulkan در خود کارت گرافیک هستن (نه در خود, بلکه از طریق درایور مستقیما با کارت گرافیک حرف میزنن) و مستقیم میتونید با کارت گرافیک صحبت کنید!

البته!!! تا الان ما در رابطه با API های محاسباتی داریم حرف میزنیم, که همون شامله CUDA, OpenCL, ROCm, Vulkan Compute و... میشه

البته, مثال رو هم یادم نرفته ها

ولی خب اینبار کمتر از مثال های پردازنده هستش, چون من CUDA/ROCm + HIP و OpenCL رو بلدم توی اینجا متاسفانه اونم دست و پا شکسته حالا

البته!! مورد اصلیتر اینه که API های HIP و ROCm دقیقا یکیه (نه اینکه حتی یه زره فرق کنه, دقیقا یکیه) چون دو تاشونم AMD ساخته ول با این تفاوت که ROCm فقط روی AMD اجرا میشه ولی HIP روی هم AMD هم NVIDIA

NVIDIA - CUDA

#include <cuda_runtime.h>
#include <math.h>

__global__ void javadTestMathKernelForArsaCmt(float* input, float* output, int n) {
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    if (idx >= n) return;

    float x = input[idx];
    float result = 0.0f;

    result += sqrtf(fabsf(x)); 
    result += powf(fabsf(x), 2.0f);
    result += powf(x, 3.0f); 
    result += sinf(x) + cosf(x) + tanf(x);
    result += asinf(x / 10.0f) + acosf(x / 10.0f);
    result += sinhf(x) + coshf(x) + tanhf(x);
    result += logf(fabsf(x) + 1.0f);
    result += log10f(fabsf(x) + 1.0f);
    result += log2f(fabsf(x) + 1.0f);
    result += expf(x / 10.0f);
    result += sqrtf(x * x + 1.0f);
    result += cbrtf(x);
    result += ceilf(x) + floorf(x);
    result += erfcf(x) + erff(x);
    result += tgammaf(x + 2.0f);
    result += lgammaf(x + 2.0f);

    output[idx] = result;
}

int main() {
    const int N = 1024 * 1024 * 256;  // 256M عنصر
    float *d_input, *d_output;
    
    cudaMalloc(&d_input, N * sizeof(float));
    cudaMalloc(&d_output, N * sizeof(float));
    javadTestMathKernelForArsaCmt<<<16384, 1024>>>(d_input, d_output, N);
    
    cudaDeviceSynchronize();
    cudaFree(d_input);
    cudaFree(d_output);
    
    return 0;
}

AMD/NVIDIA - ROCm/HIP

#include <hip/hip_runtime.h>
#include <math.h>

__global__ void javadTestMathKernelForArsaCmt(float* input, float* output, int n) {
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    if (idx >= n) return;

    float x = input[idx];
    float result = 0.0f;

    result += sqrtf(fabsf(x));
    result += powf(fabsf(x), 2.0f);
    result += powf(x, 3.0f);
    result += sinf(x) + cosf(x) + tanf(x);
    result += asinf(x / 10.0f) + acosf(x / 10.0f);
    result += sinhf(x) + coshf(x) + tanhf(x);
    result += logf(fabsf(x) + 1.0f);
    result += log10f(fabsf(x) + 1.0f);
    result += log2f(fabsf(x) + 1.0f);
    result += expf(x / 10.0f);
    result += sqrtf(x * x + 1.0f);
    result += cbrtf(x);
    result += ceilf(x) + floorf(x);
    result += erfcf(x) + erff(x);
    result += tgammaf(x + 2.0f);
    result += lgammaf(x + 2.0f);

    output[idx] = result;
}

int main() {
    const int N = 1024 * 1024 * 256;
    float *d_input, *d_output;
    
    hipMalloc(&d_input, N * sizeof(float));
    hipMalloc(&d_output, N * sizeof(float));
    
    hipLaunchKernelGGL(javadTestMathKernelForArsaCmt, dim3(16384), dim3(1024), 0, 0, 
                       d_input, d_output, N);
    
    hipDeviceSynchronize();
    hipFree(d_input);
    hipFree(d_output);
    
    return 0;
}

OpenCL - All GPUs

__kernel void javadTestMathKernelForArsaCmt(__global const float* input, 
                               __global float* output, 
                               int n) {
    int idx = get_global_id(0);
    if (idx >= n) return;

    float x = input[idx];
    float result = 0.0f;

    result += sqrt(fabs(x));
    result += pow(fabs(x), 2.0f);
    result += pow(x, 3.0f);
    result += sin(x) + cos(x) + tan(x);
    result += asin(x / 10.0f) + acos(x / 10.0f);
    result += sinh(x) + cosh(x) + tanh(x);
    result += log(fabs(x) + 1.0f);
    result += log10(fabs(x) + 1.0f);
    result += log2(fabs(x) + 1.0f);
    result += exp(x / 10.0f);
    result += sqrt(x * x + 1.0f);
    result += cbrt(x);
    result += ceil(x) + floor(x);
    result += erf(x) + erfc(x);
    result += tgamma(x + 2.0f);
    result += lgamma(x + 2.0f);

    output[idx] = result;
}

 

و اینم شد از داستان معماری ها

امیدوارم لذت برده باشید, مشتاق نظرات, انتقادات, پیشنهادات و واکنش های شما هستیم :)

امیدوارم شب و روز برهمتون خوش باشه, خدانگهدارتون!

  • دوست دارم که 1
  • مرسی 1

Just Programming

لینک به دیدگاه
https://forum.arsacia.ir/topic/111550-all-cpu-gpu-architectures/
به اشتراک گذاری در سایت های دیگر

البته اسمبلر یه زبان برنامه نویسی هم هست فقط اینکه....

 

منطق اسمبلر :

 

کاربر: خب 2 + 2

اسمبلر : ها؟

کاربر:  2 + 2

اسمبلر : ها؟

کاربر : میگم 2 + 2 

اسمبلر : هااا؟

 

خلاصه دسترسي به عمق سیستم ۱۰۰ ولی فهم و شعور ۰ .همون C رو ترجیح میدم😂

Carl.png

 

.Ah shit, here we go again

 

لینک به دیدگاه
https://forum.arsacia.ir/topic/111550-all-cpu-gpu-architectures/#findComment-1165165
به اشتراک گذاری در سایت های دیگر

5 ساعت قبل، Carl گفته است:

البته اسمبلر یه زبان برنامه نویسی هم هست فقط اینکه....

 

منطق اسمبلر :

 

کاربر: خب 2 + 2

اسمبلر : ها؟

کاربر:  2 + 2

اسمبلر : ها؟

کاربر : میگم 2 + 2 

اسمبلر : هااا؟

 

خلاصه دسترسي به عمق سیستم ۱۰۰ ولی فهم و شعور ۰ .همون C رو ترجیح میدم😂

😂😂

C + C++ ON Top ( We never forget Dlang :)) 

Just Programming

لینک به دیدگاه
https://forum.arsacia.ir/topic/111550-all-cpu-gpu-architectures/#findComment-1165729
به اشتراک گذاری در سایت های دیگر

احیاناً اون تب beta_qa پروژه ما نیست؟ 😂😂

The only things making you unhappy are your own thoughts

لینک به دیدگاه
https://forum.arsacia.ir/topic/111550-all-cpu-gpu-architectures/#findComment-1167369
به اشتراک گذاری در سایت های دیگر

ارسال شده در (ویرایش شده)
2 دقیقه قبل، MohammadAli گفته است:

احیاناً اون تب beta_qa پروژه ما نیست؟ 😂😂

آره اتفاقا 😂❤️

دیگه PATH اش خیلی طولانی بود گفتم همینطوری عکس بگیرم حوصلم نگرفت دوباره بازش کنم 😂

ویرایش شده توسط Integer

Just Programming

لینک به دیدگاه
https://forum.arsacia.ir/topic/111550-all-cpu-gpu-architectures/#findComment-1167373
به اشتراک گذاری در سایت های دیگر

  • 2 هفته بعد...

موفق باشی

به اونجا که میخوایم میرسیم

           ما تو اوجه جونی بی حسیم

                 گوره بابا فردایی که نرسید

Community.png

 

 

لینک به دیدگاه
https://forum.arsacia.ir/topic/111550-all-cpu-gpu-architectures/#findComment-1183689
به اشتراک گذاری در سایت های دیگر

7 دقیقه قبل، Masmoom گفته است:

جالبه
موفق باشی گلم+

ممنونم ❤️

Just Programming

لینک به دیدگاه
https://forum.arsacia.ir/topic/111550-all-cpu-gpu-architectures/#findComment-1192886
به اشتراک گذاری در سایت های دیگر

عالی بود جواد جان خسته نباشی 

همین ادامه بده من از نزدیک پشتتم😂😂💙

                                      وقتی میرسی به قدرت و اون بالا ها میشینی

مراقب رفتارت با آدما باش                                  

                         یه روزی برمیگردی پایین همون ادم هارو میبینی   

1012238-BeNia

My BORO:

1108288-JavadInteger

لینک به دیدگاه
https://forum.arsacia.ir/topic/111550-all-cpu-gpu-architectures/#findComment-1194648
به اشتراک گذاری در سایت های دیگر

1 ساعت قبل، EzraeeI گفته است:

عالی بود جواد جان خسته نباشی 

همین ادامه بده من از نزدیک پشتتم😂😂💙

د آخه مشتی 😂 

Just Programming

لینک به دیدگاه
https://forum.arsacia.ir/topic/111550-all-cpu-gpu-architectures/#findComment-1194807
به اشتراک گذاری در سایت های دیگر

هم جامع هم کامل

لایک

                                      وقتی میرسی به قدرت و اون بالا ها میشینی

مراقب رفتارت با آدما باش                                  

                         یه روزی برمیگردی پایین همون ادم هارو میبینی   

1012238-BeNia

My BORO:

1108288-JavadInteger

لینک به دیدگاه
https://forum.arsacia.ir/topic/111550-all-cpu-gpu-architectures/#findComment-1203667
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است!

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری
  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی، در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...