首页 > 编程语言 >cuda编程(1)

cuda编程(1)

时间:2023-08-20 16:11:53浏览次数:32  
标签:thread int 编程 unsigned cuda gpu ARRAY SIZE

cuda:

#include <stdio.h>
#include <stdlib.h>
//#include <conio.h>

__global__  void what_is_my_id (unsigned int *  const block, unsigned int*  const thread, unsigned int* const warp, 
unsigned int* const calc_thread)
{
       
	const unsigned int thread_idx = (blockIdx.x * blockDim.x) + threadIdx.x;
	printf("%d  \n", thread_idx);
	block[thread_idx] = blockIdx.x;
	thread[thread_idx] = threadIdx.x;
	warp[thread_idx] = threadIdx.x / warpSize;
	calc_thread[thread_idx] = thread_idx;
}
#define ARRAY_SIZE  128
#define ARRAY_SIZE_IN_BYTES  (sizeof(unsigned int) * (ARRAY_SIZE))

unsigned int cpu_block[ARRAY_SIZE];
unsigned int cpu_thread[ARRAY_SIZE];
unsigned int cpu_warp[ARRAY_SIZE];
unsigned int cpu_calc_thread[ARRAY_SIZE];


int main(void)
{
	const unsigned int num_blocks = 2;
	const unsigned int num_threads = 64;
	unsigned int *  gpu_block;
	unsigned int * gpu_thread;
	unsigned int * gpu_warp;
	unsigned int * gpu_calc_thread;
	
	unsigned int i;
	
	cudaMalloc((void **)&gpu_block, ARRAY_SIZE_IN_BYTES);
	cudaMalloc((void **)&gpu_thread, ARRAY_SIZE_IN_BYTES);
	cudaMalloc((void **)&gpu_warp, ARRAY_SIZE_IN_BYTES);
	cudaMalloc((void **)&gpu_calc_thread, ARRAY_SIZE_IN_BYTES);
	
	what_is_my_id<<<num_blocks, num_threads>>> (gpu_block, gpu_thread, gpu_warp, gpu_calc_thread);
	
	cudaMemcpy(cpu_block, gpu_block, ARRAY_SIZE_IN_BYTES, cudaMemcpyDeviceToHost);
	cudaMemcpy(cpu_thread, gpu_thread, ARRAY_SIZE_IN_BYTES, cudaMemcpyDeviceToHost);
	cudaMemcpy(cpu_warp, gpu_warp, ARRAY_SIZE_IN_BYTES, cudaMemcpyDeviceToHost);
	cudaMemcpy(cpu_calc_thread, gpu_calc_thread, ARRAY_SIZE_IN_BYTES, cudaMemcpyDeviceToHost);
	
	cudaFree(gpu_block);
	cudaFree(gpu_thread);
	cudaFree(gpu_warp);
	cudaFree(gpu_calc_thread);
	
	for(int i = 0; i < ARRAY_SIZE; i++)
	{
		printf("calculated thread: %d - block: %d - warp %d - Thread %d \n", cpu_calc_thread[i], cpu_block[i], cpu_warp[i], cpu_thread[i]);
	}
	//ch = getch();


}

 cmakelist:

add_definitions(-std=c++11)
find_package(CUDA REQUIRED) include_directories(${CUDA_INCLUDE_DIRS}) cuda_add_executable(test test.cu) target_link_libraries(test ${CUDA_LIBRARIES})

 

标签:thread,int,编程,unsigned,cuda,gpu,ARRAY,SIZE
From: https://www.cnblogs.com/xiaochouk/p/17644130.html

相关文章

  • 编程随想曲周刊(第42期)
    这里记录每周的所见所闻,周日发布。点击阅读原文可以直接访问文章链接。编程科技爱好者周刊#267:5G的春天要来了灰狐和他的朋友们工具Arc浏览器「iOS」默沙东诊疗手册(大众版)文章「2023年度演讲全文」雷军:成长的经历和感悟无需意志力的事情,更容易成功从番茄时钟和记......
  • linux环境编程(1): 实现一个单元测试框架-2
    正片开始在之前的文章中,介绍了如何实现一个类似gtest的单元测试框架,完整的项目代码可以参考这里:https://github.com/kfggww/cutest.近期对cutest的实现做了一些修改,包括:TestSuite的声明宏,修改为TEST_SUITE增加TestSuite的声明宏TEST_SUITE_WITH.可传递Suite的......
  • [cuda]RMSNorm核函数解析
    计算原理\(RMSNorm=x*(sqrt(1/n*(x_i)^2+eps))*g\)torch实现classRMSNorm(torch.nn.Module):def__init__(self,dim:int,eps:float=1e-6):super().__init__()self.eps=epsself.weight=nn.Parameter(torch.ones(dim))......
  • 探索编程世界的宝藏:程序员必掌握的20大算法
    #程序员必须掌握哪些算法?#1引言在当今数字化时代,程序员们仍然需要拥有一把解决问题和优化代码的金钥匙。这些钥匙是算法,它们隐藏在计算机科学的宝藏中,等待着我们去发现和掌握。本篇博文将带你踏上一段引人入胜的探险之旅,揭开程序员必须掌握的20大算法的神秘面纱。从冒泡排序到......
  • Linux网络编程(epoll的ET模式和LT模式)
    (文章目录)前言本篇文章主要来讲解epoll的ET模式和LT模式,epoll中有两种模式可以选择一种是ET模式(边缘触发模式),另一种是LT模式(水平触发模式)一、ET模式和LT模式概念讲解1.水平触发模式(LT,Level-Triggered)在水平触发模式下,当一个文件描述符上的I/O事件就绪时,epoll会立即通知......
  • 异步编程:promise and future
    本文介绍C++中异步编程相关的基础操作类,以及借鉴promiseandfuture思想解决回调地狱介绍。std::threadandstd::jthreadstd::thread为C++11引入,一个简单的例子如下:classWorkerfinal{public:voidExecute(){std::cout<<__FUNCTION__<<std::endl;}......
  • [编程题]有理数运算
    RationalArithmetic(20)__牛客网(nowcoder.com)输入描述:每个输入文件只包含一个测试用例,测试用例会给出一行数据,格式为“a1/b1a2/b2”分子分母的范围都在长整型的范围内,如果数字为负,则符号只会出现在分子的前面。分母一定是非零数。输出描述:针对每个测试用例,都输出四行,分别是这......
  • 面向对象编程
    面向对象编程多[多种]态[状态]基本介绍方法或对象具有多种状态,是面向对象的第三大特征多态的具体体现方法的多态对象的多态/*1.一个对象的编译类型和运行类型可以不一致2.编译类型在定义对象时,就确定了,不能改变3.运行类型是可以变化的4.编译类型看定义时=号的左......
  • C语言编程的结构化要求和正确性与容错性要求
    一、结构化要求(1)禁止出现两条等价的支路。(2)禁止使用GOTO跳转语句。(3)用IF语句来强调只执行两组语句中的一组。禁止ELSEGOTO和ELSERETURN。(4)用CASE实现多路分支。(5)避免从循环引出多个出口。(6)3.6函数只有一个出口。(7)不使用条件赋值语句。(8)避免不必要的分支。(9)不要轻易用条件......
  • Linux网络编程(epoll函数的使用)
    (文章目录)前言本篇文章我们讲解epoll函数的使用方法,epoll相比于poll来说性能方面有所提升和改进。一、epoll概念特点讲解epoll是Linux上一种高性能的多路复用机制,用于监视大量文件描述符并在它们就绪时通知应用程序。它是在select和poll的基础上进一步优化和改进而来......