提交 549ba303 编写于 作者: F feilong

修正选项BUG,选项必须至少3个

上级 39b9b499
# GPU硬件平台 # GPU硬件平台
以下介绍GPU硬件平台 ***错误*** 的是? 以下介绍GPU硬件平台 ***错误*** 的是?
## 答案 ## 答案
GPU(Graphics Processing Unit)最多可以同时执行几十个线程. GPU(Graphics Processing Unit)最多可以同时执行几十个线程.
## 选项 ## 选项
### A ### A
GPU(Graphics Processing Unit) 专门用于高度并行计算,因此设计时更多的晶体管用于数据处理. GPU(Graphics Processing Unit) 专门用于高度并行计算,因此设计时更多的晶体管用于数据处理.
### B ### B
GPU(Graphics Processing Unit)可以通过计算隐藏内存访问延迟,而不是依靠大数据缓存和复杂的流控制来避免长时间的内存访问延迟. GPU(Graphics Processing Unit)可以通过计算隐藏内存访问延迟,而不是依靠大数据缓存和复杂的流控制来避免长时间的内存访问延迟.
### C ### C
GPU(Graphics Processing Unit)在相同的价格和功率范围内,比CPU提供更高的指令吞吐量和内存带宽. GPU(Graphics Processing Unit)在相同的价格和功率范围内,比CPU提供更高的指令吞吐量和内存带宽.
\ No newline at end of file
# 环境安装配置 # 环境安装配置
以下介绍关于GPU环境安装配置 ***错误***的是? 以下介绍关于GPU环境安装配置 ***错误***的是?
## 答案 ## 答案
我可以在没有NVIDIA GPU的系统上使用CUDA 我可以在没有NVIDIA GPU的系统上使用CUDA
## 选项 ## 选项
### A ### A
CUDA可以安装在Windows操作系统中. CUDA可以安装在Windows操作系统中.
### B ### B
CUDA可以安装在Linux系统中. CUDA可以安装在Linux系统中.
### C ### C
CUDA可以安装在Jetson系统上 CUDA可以安装在Jetson系统上
...@@ -2,13 +2,20 @@ ...@@ -2,13 +2,20 @@
以下哪个编译器可以用来编译CUDA程序? 以下哪个编译器可以用来编译CUDA程序?
## 答案 ## 答案
nvcc nvcc
## 选项 ## 选项
### A ### A
gcc gcc
### B ### B
g++ g++
### C
clang
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
## 答案 ## 答案
```C++ ```C++
kernel<<<gridDim, blockDim>>>(a,b,c) kernel<<<gridDim, blockDim>>>(a,b,c)
``` ```
...@@ -11,16 +12,19 @@ kernel<<<gridDim, blockDim>>>(a,b,c) ...@@ -11,16 +12,19 @@ kernel<<<gridDim, blockDim>>>(a,b,c)
## 选项 ## 选项
### A ### A
```C++ ```C++
kernel(a,b,c) kernel(a,b,c)
``` ```
### B ### B
```C++ ```C++
kernel<<<gridDim>>>(a,b,c) kernel<<<gridDim>>>(a,b,c)
``` ```
### C ### C
```C++ ```C++
kernel(a,b,c)<<<gridDim, blockDim>>> kernel(a,b,c)<<<gridDim, blockDim>>>
``` ```
\ No newline at end of file
# CPU和GPU的通讯 # CPU和GPU的通讯
以下说法中错误的是 以下说法中错误的是
## 答案 ## 答案
\_\_device\_\_标注的函数可以在host端调用,并在host上执行 \_\_device\_\_标注的函数可以在host端调用,并在host上执行
## 选项 ## 选项
### A ### A
\_\_global\_\_标注的函数可以在host端调用,并在device上执行 \_\_global\_\_标注的函数可以在host端调用,并在device上执行
### B ### B
\_\_device\_\_标注的函数可以在device端调用,并在device上执行 \_\_device\_\_标注的函数可以在device端调用,并在device上执行
### C ### C
在最新的GPU架构上, \_\_global\_\_标注的函数可以在device端调用,并在device上执行. 在最新的GPU架构上, \_\_global\_\_标注的函数可以在device端调用,并在device上执行.
# 使用多个线程的核函数 # 使用多个线程的核函数
以下说法错误的是? 以下说法错误的是?
## 答案 ## 答案
每个block内可以设置无限多个thread. 每个block内可以设置无限多个thread.
## 选项 ## 选项
### A ### A
核函数会被你设置的每一个线程执行. 核函数会被你设置的每一个线程执行.
### B ### B
CUDA中的grid和block可以是一维, 二维或者三维. CUDA中的grid和block可以是一维, 二维或者三维.
### C ### C
在host端代码中需要通常需要显示或者隐式的设置同步命令, 让CPU知道GPU中的线程执行完毕. 在host端代码中需要通常需要显示或者隐式的设置同步命令, 让CPU知道GPU中的线程执行完毕.
# CUDA线程 # CUDA线程
在以下形式代码中调用kernel函数的前提下, 那每个线程的全局索引正确的是? 在以下形式代码中调用kernel函数的前提下, 那每个线程的全局索引正确的是?
```C++ ```C++
dim3 gridDim = blocksPerGrid; dim3 gridDim = blocksPerGrid;
dim3 blockDim = threadsPerBlock; dim3 blockDim = threadsPerBlock;
...@@ -10,6 +12,7 @@ kernel<<<gridDim, blockDim>>>(a,b,c) ...@@ -10,6 +12,7 @@ kernel<<<gridDim, blockDim>>>(a,b,c)
``` ```
## 答案 ## 答案
```C++ ```C++
index = threadIdx.x + blockIdx.x * blockDim; index = threadIdx.x + blockIdx.x * blockDim;
``` ```
...@@ -17,16 +20,19 @@ index = threadIdx.x + blockIdx.x * blockDim; ...@@ -17,16 +20,19 @@ index = threadIdx.x + blockIdx.x * blockDim;
## 选项 ## 选项
### A ### A
```C++ ```C++
index = threadIdx.x + blockDim; index = threadIdx.x + blockDim;
``` ```
### B ### B
```C++ ```C++
index = threadIdx.x * threadDim; index = threadIdx.x * threadDim;
``` ```
### C ### C
```C++ ```C++
index = blockIdx.x * blockDim; index = blockIdx.x * blockDim;
``` ```
\ No newline at end of file
# 多维网格 # 多维网格
以下代码调用kernel函数, 对于多维Grid中每个线程在***全局***中的索引(x, y)正确的是? 以下代码调用kernel函数, 对于多维Grid中每个线程在***全局***中的索引(x, y)正确的是?
```C++ ```C++
dim3 gridDim = (blocksPerGrid, blocksPerGrid); dim3 gridDim = (blocksPerGrid, blocksPerGrid);
dim3 blockDim = (threadsPerBlock, threadsPerBlock); dim3 blockDim = (threadsPerBlock, threadsPerBlock);
......
# 网格和线程块 # 网格和线程块
以下说法不正确的是? 以下说法不正确的是?
## 答案 ## 答案
...@@ -12,4 +13,10 @@ ...@@ -12,4 +13,10 @@
同一个Block中的线程一定会运行在同一个SM中 同一个Block中的线程一定会运行在同一个SM中
### B ### B
一个Grid可以包含多个线程block 一个Grid可以包含多个线程block
### C
一个Grid可以包含1个线程block
\ No newline at end of file
...@@ -3,15 +3,19 @@ ...@@ -3,15 +3,19 @@
以下关于GPU存储单元说法正确的是? 以下关于GPU存储单元说法正确的是?
## 答案 ## 答案
在CPU上初始化的数据需要显式或者隐式的传输到GPU存储单元, 然后才能被CUDA线程读取. 在CPU上初始化的数据需要显式或者隐式的传输到GPU存储单元, 然后才能被CUDA线程读取.
## 选项 ## 选项
### A ### A
CUDA线程可以直接访问CPU中的内存设备. CUDA线程可以直接访问CPU中的内存设备.
### B ### B
CPU不可以对GPU中的Global Memory读写. CPU不可以对GPU中的Global Memory读写.
### C ### C
GPU内存读写带宽只与CUDA版本有关. GPU内存读写带宽只与CUDA版本有关.
\ No newline at end of file
...@@ -3,13 +3,19 @@ ...@@ -3,13 +3,19 @@
下面关于GPU存储单元说法错误的是? 下面关于GPU存储单元说法错误的是?
## 答案 ## 答案
CUDA线程有对所有类型的存储类型的读写权限 CUDA线程有对所有类型的存储类型的读写权限
## 选项 ## 选项
### A ### A
同一个Block内的线程可以通过 shared memory来进行协作 同一个Block内的线程可以通过 shared memory来进行协作
### B ### B
CPU可以对GPU中的global memory, constant memory 和 texture memory进行读写
CPU可以对GPU中的global memory, constant memory 进行读写
### C
CPU可以对GPU中的texture memory进行读写
\ No newline at end of file
...@@ -3,14 +3,21 @@ ...@@ -3,14 +3,21 @@
下面关于GPU存储单元的分配与释放的说法错误的是? 下面关于GPU存储单元的分配与释放的说法错误的是?
## 答案 ## 答案
可以使用`cudaMemcpy(d_m, h_m, sizeof(int)*m*m, cudaMemcpyHostToDevice)` 的形式将数据从GPU传输给CPU 可以使用`cudaMemcpy(d_m, h_m, sizeof(int)*m*m, cudaMemcpyHostToDevice)` 的形式将数据从GPU传输给CPU
## 选项 ## 选项
### A ### A
可是使用`cudaMalloc()`函数来分配GPU存储空间
可以使用`cudaMalloc()`函数来分配GPU存储空间
### B ### B
可以使用`cudaFree()`函数来释放显存 可以使用`cudaFree()`函数来释放显存
### C
不可以使用`free()`函数来释放显存
# 数据传输 # 数据传输
对于CUDA中的数据传输函数`cudaMemcpy(void *dst, const void *src, size_t count, cudaMemcpyKind kind) 对于CUDA中的数据传输函数 `cudaMemcpy(void *dst, const void *src, size_t count, cudaMemcpyKind kind)`, 以下说法错误的是?
`,以下说法错误的是?
## 答案 ## 答案
...@@ -10,10 +9,13 @@ count可以无限大 ...@@ -10,10 +9,13 @@ count可以无限大
## 选项 ## 选项
### A ### A
dst可以是由cudaMalloc()分配的,指向GPU内存的地址. dst可以是由cudaMalloc()分配的,指向GPU内存的地址.
### B ### B
dst也可以是指向CPU内存的地址 dst也可以是指向CPU内存的地址
### C ### C
kind指的是数据传输方向 kind指的是数据传输方向
\ No newline at end of file
...@@ -9,9 +9,14 @@ ...@@ -9,9 +9,14 @@
## 选项 ## 选项
### A ### A
每个线程都有自己的寄存器, 其他线程无法访问. 每个线程都有自己的寄存器, 其他线程无法访问.
### B ### B
所有的线程都可以访问一个shared memory
所有的线程都可以访问一个 shared memory
### C
所有的线程都不可以访问 shared memory
\ No newline at end of file
...@@ -3,13 +3,19 @@ ...@@ -3,13 +3,19 @@
下面关于CUDA中的多种存储单元说法错误的是? 下面关于CUDA中的多种存储单元说法错误的是?
## 答案 ## 答案
Register和Shared memory有很多, 每个线程更多的占用它们,可以让更多的block驻留在SM中 Register和Shared memory有很多, 每个线程更多的占用它们,可以让更多的block驻留在SM中
## 选项 ## 选项
### A ### A
GPU上有onchip和onboard的存储单元类型 GPU上有onchip和onboard的存储单元类型
### B ### B
Onchip的存储单元包括Register 和 Shared memory Onchip的存储单元包括Register 和 Shared memory
### C
每个线程块拥有一块shared memory
# CUDA中的多种存储单元 # CUDA中的多种存储单元
下面关于GPU中多种存储单元的说法错误的是? 下面关于GPU中多种存储单元的说法错误的是?
## 答案 ## 答案
内核无法使用多于可用寄存器数量的任何变量(这也称为寄存器溢出) 内核无法使用多于可用寄存器数量的任何变量(这也称为寄存器溢出)
## 选项 ## 选项
### A ### A
寄存器变量是每个线程私有的,一旦thread执行结束,寄存器变量就会失效 寄存器变量是每个线程私有的,一旦thread执行结束,寄存器变量就会失效
### B ### B
同一个Block中的线程共享一块Shared Memory 同一个Block中的线程共享一块Shared Memory
### C ### C
在同一个编译单元,constant对所有kernel可见 在同一个编译单元,constant对所有kernel可见
# 共享内存 # 共享内存
下面关于共享内存的说法错误的是? 下面关于共享内存的说法错误的是?
## 答案 ## 答案
Shared Memory可以被设置成512KB,1024KB ,2048KB…剩下的给L1缓存 Shared Memory可以被设置成512KB,1024KB ,2048KB…剩下的给L1缓存
## 选项 ## 选项
### A ### A
有可能会出现同时有很多线程访问Shared Memory上的数据 有可能会出现同时有很多线程访问Shared Memory上的数据
### B ### B
为了克服这个同时访问的瓶颈,Shared Memory被分成32个逻辑块(banks) 为了克服这个同时访问的瓶颈,Shared Memory被分成32个逻辑块(banks)
### C
可以被同一block中的所有线程读写
# 共享内存 # 共享内存
下面关于共享内存说法错误的是? 下面关于共享内存说法错误的是?
## 答案 ## 答案
同一个warp 内多个线程访问同一个bank的同一个地址时,会出现bank冲突. 同一个 warp 内多个线程访问同一个bank的同一个地址时,会出现bank冲突.
## 选项 ## 选项
### A ### A
同常量内存一样,当一个 warp 中的所有线程访问同一地址的共享内存时,会触发一个广播(broadcast)机制到 warp 中所有线程. 同常量内存一样,当一个 warp 中的所有线程访问同一地址的共享内存时,会触发一个广播(broadcast)机制到 warp 中所有线程.
### B ### B
同一个warp 内多个线程访问同一个bank的不同地址时,会出现bank冲突.
\ No newline at end of file 同一个 warp 内多个线程访问同一个bank的不同地址时,会出现bank冲突.
### C
一个 warp 中的线程必然在同一个block中
...@@ -13,4 +13,10 @@ ...@@ -13,4 +13,10 @@
在优化矩阵乘的过程中, 我们可以利用shared memory减少从global memory中数据的读取次数. 在优化矩阵乘的过程中, 我们可以利用shared memory减少从global memory中数据的读取次数.
### B ### B
同一Block中的线程可以利用shared memory进行协作. 同一Block中的线程可以利用shared memory进行协作.
### C
同一Block中的线程可以利用shared memory进行协作, 减少从global memory中数据的读取次数
\ No newline at end of file
...@@ -9,8 +9,15 @@ ...@@ -9,8 +9,15 @@
## 选项 ## 选项
### A ### A
不需要手动拷贝数据. 不需要手动拷贝数据.
### B ### B
可以利用cudaMallocManaged() 函数分配统一内存. 可以利用cudaMallocManaged() 函数分配统一内存.
### C
统一内存是可从系统中的任何处理器访问的单个内存地址空间
...@@ -9,8 +9,14 @@ ...@@ -9,8 +9,14 @@
## 选项 ## 选项
### A ### A
运行时函数会返回错误代码. 运行时函数会返回错误代码.
### B ### B
内核启动不返回任何错误代码,因此必须在内核启动后立即调用 `cudaPeekAtLastError()``cudaGetLastError()` 以检索任何启动前错误. 内核启动不返回任何错误代码,因此必须在内核启动后立即调用 `cudaPeekAtLastError()``cudaGetLastError()` 以检索任何启动前错误.
### C
`checkCudaErrors`可对CUDA API进行错误检测,及时定位错误所在位置。
# 事件 # 事件
下面关于CUDA编程模型中的event说法错误的是? 下面关于CUDA编程模型中的event说法错误的是?
## 答案 ## 答案
...@@ -8,7 +9,9 @@ CUDA运行时提供了一种密切监视设备进度以及执行准确计时的 ...@@ -8,7 +9,9 @@ CUDA运行时提供了一种密切监视设备进度以及执行准确计时的
## 选项 ## 选项
### A ### A
以下代码示例创建`start`, `stop`两个事件: 以下代码示例创建`start`, `stop`两个事件:
```C++ ```C++
cudaEvent_t start, stop; cudaEvent_t start, stop;
cudaEventCreate(&start); cudaEventCreate(&start);
...@@ -16,8 +19,22 @@ cudaEventCreate(&stop); ...@@ -16,8 +19,22 @@ cudaEventCreate(&stop);
``` ```
### B ### B
可以利用以下代码销毁event: 可以利用以下代码销毁event:
```C++ ```C++
cudaEventDestroy(start); cudaEventDestroy(start);
cudaEventDestroy(stop); cudaEventDestroy(stop);
``` ```
### C
可以利用以下代码统计事件间消耗的时间:
```C++
cudaEventRecord(start);
cudaEventRecord(stop);
float time;
cudaEventElapsedTime(&time, start, stop);
```
# 原子操作 # 原子操作
下面关于CUDA中原子操作错误的是? 下面关于CUDA中原子操作错误的是?
## 答案 ## 答案
...@@ -8,9 +9,14 @@ ...@@ -8,9 +9,14 @@
## 选项 ## 选项
### A ### A
原子函数对驻留在全局或共享内存中的一个 32 位或 64 位字执行读-修改-写原子操作. 原子函数对驻留在全局或共享内存中的一个 32 位或 64 位字执行读-修改-写原子操作.
### B ### B
原子操作保证在不受其他线程干扰的情况下执行。 换句话说,在操作完成之前,没有其他线程可以访问它处理数据的地址。 原子操作保证在不受其他线程干扰的情况下执行。 换句话说,在操作完成之前,没有其他线程可以访问它处理数据的地址。
### C
原子操作是指,当一个线程要对同一个显存变量依次进行“读-计算-写”的操作时,操作必须连贯地执行,中间不能插入任何其他操作。
\ No newline at end of file
...@@ -9,8 +9,14 @@ ...@@ -9,8 +9,14 @@
## 选项 ## 选项
### A ### A
原子操作可以处理GPU中global memory的数据. 原子操作可以处理GPU中global memory的数据.
### B ### B
原子操作可以处理GPU中shared memory的数据. 原子操作可以处理GPU中shared memory的数据.
### C
`atomicAdd` 是一个原子操作
# CUDA流 # CUDA流
下面关于CUDA流的说法错误的是? 下面关于CUDA流的说法错误的是?
## 答案 ## 答案
...@@ -8,8 +9,14 @@ CUDA流只能在设备代码中调用执行. ...@@ -8,8 +9,14 @@ CUDA流只能在设备代码中调用执行.
## 选项 ## 选项
### A ### A
流是按顺序执行的命令序列(可能由不同的主机线程发出). 流是按顺序执行的命令序列(可能由不同的主机线程发出).
### B ### B
不同的流可能会彼此乱序或同时执行它们的命令. 不同的流可能会彼此乱序或同时执行它们的命令.
### C
CUDA流表示一个GPU操作队列,并且该队列中的操作将以指定的顺序执行
# CUDA流 # CUDA流
下面关于CUDA流的说法是错误的是? 下面关于CUDA流的说法是错误的是?
## 答案 ## 答案
调用`cudaStreamSynchronize()` 函数, 程序会一直等待,直到所有主机线程的所有流中的所有先前命令都完成. 调用`cudaStreamSynchronize()` 函数, 程序会一直等待,直到所有主机线程的所有流中的所有先前命令都完成.
## 选项 ## 选项
### A ### A
未指定任何流参数或等效地将流参数设置为零的内核启动和主机 <-> 设备内存拷贝将发布到默认流. 未指定任何流参数或等效地将流参数设置为零的内核启动和主机 <-> 设备内存拷贝将发布到默认流.
### B ### B
调用`cudaDeviceSynchronize()`函数, 程序会一直等待,直到所有主机线程的所有流中的所有先前命令都完成. 调用`cudaDeviceSynchronize()`函数, 程序会一直等待,直到所有主机线程的所有流中的所有先前命令都完成.
### C
调用`cudaStreamCreate`创建一个流
\ No newline at end of file
# CUDA流 # CUDA流
下面关于CUDA流的说法错误的是? 下面关于CUDA流的说法错误的是?
## 答案 ## 答案
以下设备操作对主机不是异步的: 以下设备操作对主机不是异步的:
* 内核启动; * 内核启动;
...@@ -13,6 +15,7 @@ ...@@ -13,6 +15,7 @@
## 选项 ## 选项
### A ### A
如果主机线程在它们之间发出以下任一操作,则来自不同流的两个命令不能同时运行: 如果主机线程在它们之间发出以下任一操作,则来自不同流的两个命令不能同时运行:
* 页面锁定的主机内存分配, * 页面锁定的主机内存分配,
...@@ -23,11 +26,18 @@ ...@@ -23,11 +26,18 @@
* 计算能力 3.x 和计算能力 7.x 中描述的 L1/共享内存配置之间的切换。 * 计算能力 3.x 和计算能力 7.x 中描述的 L1/共享内存配置之间的切换。
### B ### B
CUDA 将以下操作公开为可以彼此同时操作的独立任务: CUDA 将以下操作公开为可以彼此同时操作的独立任务:
* 在主机上计算; * 在主机上计算;
* 设备上的计算; * 设备上的计算;
* 从主机到设备的内存传输; * 从主机到设备的内存传输;
### C
CUDA 将以下操作公开为可以彼此同时操作的独立任务:
* 从设备到主机的内存传输; * 从设备到主机的内存传输;
* 在给定设备的内存中进行内存传输; * 在给定设备的内存中进行内存传输;
* 设备之间的内存传输。 * 设备之间的内存传输。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册