Any suggestions when it shows " TypeError: not enough arguments for format string " in Python?
Any suggestions when it shows " TypeError: not enough arguments for format string " in Python?
当我尝试 运行 pycuda 的矩阵乘法示例时。
kernel_code_template = """
__global__ void MatrixMulKernel(float *a,float *b,float *c){
int tx = threadIdx.x;
int ty = threadIdx.y;
float Pvalue = 0;
for(int i=0; i<%(N)s; ++i){
float Aelement = a[ty * %(N)s + i];
float Belement = b[i * %(M)s + tx];
Pvalue += Aelement * Belement;
}
c[ty * %[M]s + tx] = Pvalue;
}
"""
M, N = 2, 3
kernel_code = kernel_code_template % {'M': M, 'N': N}
它报告了如下错误:
kernel_code = kernel_code_template % {'M': M, 'N': N}
TypeError: not enough arguments for format string
我已经尝试检查“%”标记是否有任何问题,但仍然一无所获。
我认为您在混合语法,%
与 .format
字符串替换。在这里查看一个很好的总结: https://pyformat.info/
现在我发现错误(第 11 行):%[M]s
--> %(M)s
要直接回答问题,您需要将代码中的 %[M]s
更改为 %(M)s
,如下所示:
kernel_code_template = """
__global__ void MatrixMulKernel(float *a,float *b,float *c){
int tx = threadIdx.x;
int ty = threadIdx.y;
float Pvalue = 0;
for(int i=0; i<%(N)s; ++i){
float Aelement = a[ty * %(N)s + i];
float Belement = b[i * %(M)s + tx];
Pvalue += Aelement * Belement;
}
c[ty * %(M)s + tx] = Pvalue;
}
"""
然后它将按预期工作。但是,我强烈建议您开始使用 f-strings,因为您表示您正在使用 Python 3.7:
kernel_code_template = f"""
__global__ void MatrixMulKernel(float *a,float *b,float *c){{
int tx = threadIdx.x;
int ty = threadIdx.y;
float Pvalue = 0;
for(int i=0; i<{N}; ++i){{
float Aelement = a[ty * {N} + i];
float Belement = b[i * {M} + tx];
Pvalue += Aelement * Belement;
}}
c[ty * {M} + tx] = Pvalue;
}}
"""
不过,我知道这是有取舍的,即那些 {{
和 }}
转义。正如@Brandt 指出的那样,还有 .format()
方法。选择最适合您的。
当我尝试 运行 pycuda 的矩阵乘法示例时。
kernel_code_template = """
__global__ void MatrixMulKernel(float *a,float *b,float *c){
int tx = threadIdx.x;
int ty = threadIdx.y;
float Pvalue = 0;
for(int i=0; i<%(N)s; ++i){
float Aelement = a[ty * %(N)s + i];
float Belement = b[i * %(M)s + tx];
Pvalue += Aelement * Belement;
}
c[ty * %[M]s + tx] = Pvalue;
}
"""
M, N = 2, 3
kernel_code = kernel_code_template % {'M': M, 'N': N}
它报告了如下错误:
kernel_code = kernel_code_template % {'M': M, 'N': N}
TypeError: not enough arguments for format string
我已经尝试检查“%”标记是否有任何问题,但仍然一无所获。
我认为您在混合语法, https://pyformat.info/%
与 .format
字符串替换。在这里查看一个很好的总结:
现在我发现错误(第 11 行):%[M]s
--> %(M)s
要直接回答问题,您需要将代码中的 %[M]s
更改为 %(M)s
,如下所示:
kernel_code_template = """
__global__ void MatrixMulKernel(float *a,float *b,float *c){
int tx = threadIdx.x;
int ty = threadIdx.y;
float Pvalue = 0;
for(int i=0; i<%(N)s; ++i){
float Aelement = a[ty * %(N)s + i];
float Belement = b[i * %(M)s + tx];
Pvalue += Aelement * Belement;
}
c[ty * %(M)s + tx] = Pvalue;
}
"""
然后它将按预期工作。但是,我强烈建议您开始使用 f-strings,因为您表示您正在使用 Python 3.7:
kernel_code_template = f"""
__global__ void MatrixMulKernel(float *a,float *b,float *c){{
int tx = threadIdx.x;
int ty = threadIdx.y;
float Pvalue = 0;
for(int i=0; i<{N}; ++i){{
float Aelement = a[ty * {N} + i];
float Belement = b[i * {M} + tx];
Pvalue += Aelement * Belement;
}}
c[ty * {M} + tx] = Pvalue;
}}
"""
不过,我知道这是有取舍的,即那些 {{
和 }}
转义。正如@Brandt 指出的那样,还有 .format()
方法。选择最适合您的。