41 条回复  ·  4372 次点击
wwhontheway 小成 2025-11-26 10:18:53
同样的感受,ai 加速了学习和吸收知识的速度
YanSeven 初学 2025-11-26 10:19:23
@albin504 其实就是要求每个入行者都得变成以前的资深程序员。市场以后在招聘的时候也会提高招聘门槛。
zsc8917zsc 初学 2025-11-26 10:20:28
@dearmymy #2 你是不是在找 figma 的 mcp ~
albin504 楼主 初学 2025-11-26 10:28:49
@crocoBaby 嗯嗯,谢谢,抽空我也看看。这方面我是门外汉,我只是拼感觉提的几个问题。
crocoBaby 初学 2025-11-26 10:43:16
@albin504 我也是门外汉,最近才开始学这方面的知识,有好的技巧欢迎分享
qieqie 初学 2025-11-26 10:55:59
你这个数据不太对,dot product 纯 memory bound 的,跑不出来 19 倍差距,明显是刻意避免了优化 cpu 代码(avx 或 O3 开 auto vectorization )
albin504 楼主 初学 2025-11-26 11:01:27
@qieqie 遇到行家了。我贴一下代码: ``` #include #include #include #include #include "common/book.h" #define N (32 * 1024 * 1024) // 32M elements #define THREADS_PER_BLOCK 256 // Kernel to initialize data directly on GPU __global__ void init_data_kernel(float *a, float *b, int n) { int tid = threadIdx.x + blockIdx.x * blockDim.x; int stride = blockDim.x * gridDim.x; for (int i = tid; i < n; i += stride) { a[i] = 1.0f; b[i] = 2.0f; } } // Dot product computation kernel (Same as before) __global__ void dot_product_kernel(float *a, float *b, float *c, int n) { int tid = threadIdx.x + blockIdx.x * blockDim.x; int stride = blockDim.x * gridDim.x; float sum = 0; for (int i = tid; i < n; i += stride) { sum += a[i] * b[i]; } // Shared memory reduction per block __shared__ float cache[THREADS_PER_BLOCK]; int cacheIndex = threadIdx.x; cache[cacheIndex] = sum; __syncthreads(); int i = blockDim.x / 2; while (i != 0) { if (cacheIndex < i) cache[cacheIndex] += cache[cacheIndex + i]; __syncthreads(); i /= 2; } if (cacheIndex == 0) atomicAdd(c, cache[0]); } void dot_product_cpu(float *a, float *b, float *c, int n) { double sum = 0; for (int i = 0; i < n; i++) { sum += a[i] * b[i]; } *c = (float)sum; } int main() { // Host pointers (only for verification) float *a_host, *b_host, *c_cpu, *c_gpu; // Device pointers float *dev_a, *dev_b, *dev_c; // Allocate host memory (just for CPU verification) a_host = (float*)malloc(N * sizeof(float)); b_host = (float*)malloc(N * sizeof(float)); c_cpu = (float*)malloc(sizeof(float)); c_gpu = (float*)malloc(sizeof(float)); // Initialize host arrays for CPU calculation for(int i=0; i 65535) blocksPerGrid = 65535; init_data_kernel<<>>(dev_a, dev_b, N); HANDLE_ERROR(cudaGetLastError()); // Reset result float zero = 0.0f; HANDLE_ERROR(cudaMemcpy(dev_c, &zero, sizeof(float), cudaMemcpyHostToDevice)); // Tiny copy (4 bytes) // 3. Compute dot_product_kernel<<>>(dev_a, dev_b, dev_c, N); HANDLE_ERROR(cudaGetLastError()); cudaDeviceSynchronize(); // 4. Copy Result Back HANDLE_ERROR(cudaMemcpy(c_gpu, dev_c, sizeof(float), cudaMemcpyDeviceToHost)); // Tiny copy (4 bytes) end = clock(); double gpu_time = ((double)(end - start)) / CLOCKS_PER_SEC * 1000.0; printf("GPU Result: %.2f\n", *c_gpu); printf("GPU Time (Total including Init on GPU): %.2f ms\n", gpu_time); // Compare printf("Speedup (GPU vs CPU): %.2fx\n", cpu_time / gpu_time); // Cleanup free(a_host); free(b_host); free(c_cpu); free(c_gpu); cudaFree(dev_a); cudaFree(dev_b); cudaFree(dev_c); return 0; } ``` 这个版本是在 GPU 上初始化向量。 AI 给出的第一版是在 CPU 上初始化向量然后 copy 到 GPU ,这个 copy 过程成为了瓶颈( 200 多 M 数据 copy 花费 64ms )
houOne 初学 2025-11-26 11:13:18
@dearmymy 有没有 Adobe AI 软件的 mcp ,能够替代 印刷文件制作的。
xqk111 小成 2025-11-26 11:18:15
降低学习门槛,不像以前问都没有渠道,知识太分散,找都不好找。
qieqie 初学 2025-11-26 11:19:09
哪怕不用 avx intrinsics, -Ofast 这个量级不太差的 cpu 应该 <10ms 。如果数据初始在 host 内存上,加上 h2d d2h 单次运行会比 cpu 直接跑还慢的。 如果你想体验 gpu 的暴力,demo 应该用 GEMM ,还得加 batch
返回顶部