Mathematica中的CUDAFunctionLoad-索引问题

如何解决Mathematica中的CUDAFunctionLoad-索引问题

| 我正在尝试调试CUDA计算机上存在的索引问题
Cuda Machine Info:
  {1-> {名称-> Tesla C2050,时钟速率-> 1147000,计算能力->2。,GPU重叠-> 1,最大块尺寸-> {1024,1024,64},最大网格尺寸-> {65535 ,65535,65535},每块最大线程数-> 1024,每块最大共享内存数-> 49152,总恒定内存-> 65536,经线大小-> 32,最大间距-> 2147483647,每块最大寄存器数-> 32768,纹理对齐-> 512,多处理器计数-> 14,核心计数-> 448,执行超时-> 0,集成->假,可以映射主机内存->真,计算模式->默认,Texture1D Width-> 65536,Texture2D宽度-> 65536,Texture2D高度-> 65535,Texture3D宽度-> 2048,Texture3D高度-> 2048,Texture3D深度-> 2048,Texture2D阵列宽度-> 16384,Texture2D阵列高度-> 16384,Texture2D阵列切片-> 2048,表面对齐-> 512,并发内核-> True,启用ECC-> True,总内存-> 2817982462}, 此代码所做的全部工作就是将3D数组的值设置为等于CUDA使用的索引:
__global __ void cudaMatExp(
float *matrix1,float *matrixStore,int lengthx,int lengthy,int lengthz){

long UniqueBlockIndex = blockIdx.y * gridDim.x + blockIdx.x;

long index = UniqueBlockIndex * blockDim.z * blockDim.y * blockDim.x +
    threadIdx.z * blockDim.y * blockDim.x + threadIdx.y * blockDim.x +
    threadIdx.x;

if (index < lengthx*lengthy*lengthz) {

matrixStore[index] =  index;

}
}
由于某种原因,一旦我的3D数组的尺寸变得太大,索引就会停止。 我尝试了不同的块尺寸(由blockDim.y的blockDim.y划分的blockDim.x): 8x8x8仅在数组尺寸为12x12x12时给出正确的索引 9x9x9仅在数组尺寸为14x14x14时给出正确的索引 10x10x10仅在数组尺寸为15x15x15时给出正确的索引 对于大于这些尺寸的尺寸,所有不同的块大小最终都会再次开始增加,但是它们永远不会达到dim ^ 3-1的值(这是cuda线程应达到的最大索引) 这是一些图解说明此行为: 例如:这是在x轴上绘制3D数组的尺寸(即xxx),在y轴上绘制在cuda执行过程中处理的最大索引号。此特定图适用于10x10x10的块尺寸。 这是(Mathematica)代码来生成该图,但是当我运行该图时,我使用了1024x1x1的块尺寸:
CUDAExp = CUDAFunctionLoad[codeexp,\"cudaMatExp\",{{\"Float\",_,\"Input\"},{\"Float\",\"Output\"},_Integer,_Integer},{1024,1,1}]; (*These last three numbers are the block dimensions*)

max = 100; (* the maximum dimension of the 3D array *)
hold = Table[1,{i,max}];
compare = Table[i^3,max}];
Do[
   dim = ii;
   AA  = CUDAMemoryLoad[ConstantArray[1.0,{dim,dim,dim}],Real,\"TargetPrecision\" -> \"Single\"];
   BB  = CUDAMemoryLoad[ConstantArray[1.0,\"TargetPrecision\" -> \"Single\"];

   hold[[ii]] = Max[Flatten[
                  CUDAMemoryGet[CUDAExp[AA,BB,dim][[1]]]]];,{ii,max}]

ListLinePlot[{compare,Flatten[hold]},PlotRange -> All]
这是相同的图,但现在将x ^ 3绘制为与应该在的位置进行比较。请注意,它在数组的维数> 32之后发散 我测试了3D数组的尺寸,查看索引进行了多远,并将其与dim ^ 3-1进行了比较。例如。对于dim = 32,cuda max索引是32767(32 ^ 3 -1),但是对于dim = 33,cuda输出是33791,应该是35936(33 ^ 3 -1)。请注意33791-32767 = 1024 = blockDim.x 题: 有没有办法正确索引尺寸大于Mathematica中块尺寸的数组? 现在,我知道有些人在其索引方程式中使用__mul24(threadIdx.y,blockDim.x)来防止位乘法出现错误,但这似乎对我的情况没有帮助。 另外,我看到有人提到您应该使用-arch = sm_11编译代码,因为默认情况下,它是针对计算能力1.0编译的。我不知道Mathematica中是否是这种情况。我假设CUDAFunctionLoad []知道要使用2.0功能进行编译。有人知道吗? 任何建议都将非常有帮助!     

解决方法

        因此,Mathematica具有隐藏的处理网格尺寸的方法,要将网格尺寸固定为可以使用的尺寸,则必须在要调用的函数的末尾添加另一个数字。 该参数表示要启动的线程数(或网格尺寸乘以块尺寸)。 例如,在我上面的代码中:
CUDAExp = 
  CUDAFunctionLoad[codeexp,\"cudaMatExp\",{
           {\"Float\",_,\"Input\"},{\"Float\",\"Output\"},_Integer,_Integer},{8,8,8},\"ShellOutputFunction\" -> Print];
(8,8)表示块的尺寸。 在mathematica中调用ѭ4,时,可以添加一个参数来表示要启动的线程数: 在此示例中,我终于将其与以下对象一起使用:
// AA and BB are 3D arrays of 0 with dimensions dim^3
dim = 64;
CUDAExp[AA,BB,dim,4089];
请注意,使用CUDAFunctionLoad []进行编译时,它只需要5个输入,第一个是您传递给它的数组(尺寸为
dim x dim x dim
),第二个是存储它的内存的位置。第三,第四和第五个是尺寸。 当您将其传递第六时,mathematica会将其转换为
gridDim.x * blockDim.x
,因此,由于我知道我需要gridDim.x = 512才能处理数组中的每个元素,因此我将此数字设置为512 * 8 = 4089。 我希望这对于将来遇到此问题的人来说是清楚且有用的。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res