为啥我的 GPU 拒绝接受共享内存配置而不发出错误?
Posted
技术标签:
【中文标题】为啥我的 GPU 拒绝接受共享内存配置而不发出错误?【英文标题】:Why does my GPU refuse to accept a shared memory configuration without emitting an error?为什么我的 GPU 拒绝接受共享内存配置而不发出错误? 【发布时间】:2022-01-01 00:02:47 【问题描述】:考虑下面的程序。
它获取 CUDA 设备当前的共享内存银行大小配置;将其设置为另一个值;然后再次得到它。不幸的是,这是输出:
The reported shared memory bank size for device 0 is: 4 bytes.
Will now set the shared memory bank size for device 0 to: 8 bytes.
After setting shared memory bank size to 8 bytes,
the reported shared memory bank size for device 0 is: 4 bytes.
我的问题:为什么会发生这种情况?具体来说,
是否某些 CUDA GPU 会直接忽略此设置?如果是这样,为什么设置银行配置时没有返回错误? 也许我的程序有错误? 是因为我同时使用运行时 API 和驱动程序 API 调用吗?注意事项:
为了便于阅读,我已经删除了大部分错误检查,但您需要相信我,我确实会检查错误。 我在 Devuan GNU/Linux Chimaera 上的 GTX 1050 Ti Boost、CUDA 11.4、驱动程序 470.57.02 上运行它。#include <cuda.h>
#include <cuda_runtime.h>
#include <iostream>
#include <cassert>
const char* bank_size_descriptions[] = "default", "4 bytes", "8 bytes" ;
const char* bank_size_description(CUsharedconfig config) return bank_size_descriptions[config];
int main()
int device_id 0 ;
CUcontext top_of_context_stack;
CUsharedconfig bs_config;
CUcontext primary_context_handle;
CUresult status;
cudaSetDevice(0);
cuDevicePrimaryCtxRetain(&primary_context_handle, device_id);
cuCtxGetCurrent(&top_of_context_stack);
assert(top_of_context_stack == primary_context_handle);
cuCtxGetSharedMemConfig(&bs_config);
std::cout
<< "The reported shared memory bank size for device "
<< device_id << " is: " << bank_size_description(bs_config) << ".\n";
auto new_bs_config =
(bs_config == CU_SHARED_MEM_CONFIG_FOUR_BYTE_BANK_SIZE) ?
CU_SHARED_MEM_CONFIG_EIGHT_BYTE_BANK_SIZE :
CU_SHARED_MEM_CONFIG_FOUR_BYTE_BANK_SIZE;
std::cout
<< "Will now set the shared memory bank size for device "
<< device_id << " to: " << bank_size_description(new_bs_config) << ".\n";
status = cuCtxSetSharedMemConfig(new_bs_config);
assert(status == CUDA_SUCCESS);
cuCtxGetSharedMemConfig(&bs_config);
if (bs_config != new_bs_config)
std::cerr
<< "After setting shared memory bank size to " << bank_size_description(new_bs_config)
<< ",\nthe reported shared memory bank size for device "
<< device_id << " is: " << bank_size_description(bs_config) << '.' << std::endl;
exit(EXIT_FAILURE);
【问题讨论】:
This function will do nothing on devices with fixed shared memory bank size.
在这种情况下我不希望出现错误。
@AbatorAbetor:我确信我会得到一个CUDA_ERROR_INVALID_VALUE
用于特定的银行规模,而不是固定银行规模。无论如何,你能回答这个问题吗?
【参考方案1】:
CUDA driver api documentation 声明如下。
This function will do nothing on devices with fixed shared memory bank size.
我认为在这种情况下“什么都不做”是成功的,因此不会返回错误代码。
【讨论】:
以上是关于为啥我的 GPU 拒绝接受共享内存配置而不发出错误?的主要内容,如果未能解决你的问题,请参考以下文章